web-dev-qa-db-ja.com

テスト接続を使用したPowershellの試行/キャッチ

オフラインのコンピューターをテキストファイルに記録して、後で再度実行できるようにしようとしています。記録されている、またはキャッチされているようには見えません。

function Get-ComputerNameChange {

    [CmdletBinding()]
    Param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)]
    [string[]]$computername,
    [string]$logfile = 'C:\PowerShell\offline.txt'
    )




    PROCESS {

        Foreach($computer in $computername) {
        $continue = $true
        try { Test-Connection -computername $computer -Quiet -Count 1 -ErrorAction stop
        } catch [System.Net.NetworkInformation.PingException]
        {
            $continue = $false

            $computer | Out-File $logfile
        }
        }

        if($continue){
        Get-EventLog -LogName System -ComputerName $computer | Where-Object {$_.EventID -eq 6011} | 
        select machinename, Time, EventID, Message }}}
8
MattMoo

tryは、catching例外用です。 -Quietスイッチを使用しているため、Test-Connection$trueまたは$falseを返し、接続が失敗してもthrow例外を返しません。

ただしてください:

if (Test-Connection -computername $computer -Quiet -Count 1) {
    # succeeded do stuff
} else {
    # failed, log or whatever
}
4
briantist

特に本番環境でスクリプトを使用する場合は、Try/Catchブロックの方が適しています。 OPのコードは機能します。Test-Connectionから-Quietパラメーターを削除し、指定されたエラーをトラップする必要があります。 PowerShell 5.1のWin10でテストしましたが、うまく機能します。

    try {
        Write-Verbose "Testing that $computer is online"
        Test-Connection -ComputerName $computer -Count 1 -ErrorAction Stop | Out-Null
        # any other code steps follow
    catch [System.Net.NetworkInformation.PingException] {
        Write-Warning "The computer $(($computer).ToUpper()) could not be contacted"
    } # try/catch computer online?

私は過去にこれらの状況を乗り越えてきました。処理が必要なときに正しいエラーを確実にキャッチしたい場合は、$ error変数に保持されるエラー情報を調べてください。最後のエラーは$ error [0]です。まず、Get-Memberにパイプして、そこからドット表記でドリルインします。

ドン・ジョーンズとジェフリー・ヒックスは、DSCのような基本的なトピックから高度なトピックまですべてをカバーする素晴らしい本のセットを利用できます。これらの本を読むことで、私の機能開発の取り組みに新しい方向性が与えられました。

1
ChrisS