3

末尾にが付いたwhile($true)ループがあります。目的は、サーバーのリストを実行し、最後の1分以内に変更がないかイベントログを確認し、それに応じて対応する別のユーザーとしてstart-sleep -s 60外部PowerShellスクリプトを開始することです。

私のwhileループ(下記)は-credentialフラグを使用して他の誰かとしてスクリプトを実行しているので、エラー(アカウントのロックアウト、パスワードの期限切れ、ファイルの欠落など)が心配です。

ステートメントを試し、if ($error)外部スクリプトのファイル名を変更しましたが、アラートが表示されませんでした。自分自身を再チェックするのが止まらないからだと思いますか?

while($true) { 

    # Start the scan
    Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1'

    # Sleep 60 seconds
    start-sleep -s 60

}

スケジュールされたタスクを毎分実行するように変更できると思いますが、これまでのところ、このループはうまく機能しているようです。ループがアクティブなときにエラーチェックを導入したいだけです。

4

2 に答える 2

3

try / catchブロックを試しましたか?間違ったクレデンシャルは終了エラーであるため、tryブロックの残りのコードはクレデンシャルエラーの後に実行されません。あなたがそれを捕まえるとき、あなたはあなたがやりたいことを何でもすることができます。

try { 
    Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1'
} catch {
    #Catches terminating exceptions and display it's message
    Write-Error $_.message
}

すべてのエラーをキャッチしたい場合は-ErrorAction Stop、行に追加しStart-Processます。前述のように、クレデンシャルは終了エラーである必要があり、erroractionパラメーターが不要になります

編集Start-Processそもそもなぜスクリプトを実行するために使用するのですか?Invoke-CommandPowerShellスクリプトをリモートで実行するものに切り替えました。スクリプトファイルが見つからない場合は、非終了エラーが発生します。これは非終了エラーであるため、-ErrorAction Stopパラメーターを使用する必要があります。ファイルの欠落エラーおよびその他すべてのエラー(資格情報など)をキャッチするには、次のようなものを使用します。

try { Invoke-Command -ScriptBlock { & c:\batch\02-Scan.ps1 } -ErrorAction Stop
} catch {
    if ($_.Exception.GetType().Name -eq "CommandNotFoundException") {
        Write-Error "File is missing"
    } else {
        Write-Error "Something went wrong. Errormessage: $_"
        #or throw it directly:
        #throw $_
    }
}
于 2013-02-11T18:36:22.133 に答える
0

多分?

while($true) { 

# Start the scan
try{
Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1' -ErrorAction Stop
}
  catch {
          send-alert
          break
          }

# Sleep 60 seconds
start-sleep -s 60
}
于 2013-02-11T18:36:13.870 に答える