2013-02-11 75 views
2

我有一個while($true)循環,最後有一個start-sleep -s 60。其目的是作爲不同用戶啓動外部PowerShell腳本,該用戶將運行一系列服務器,在最後一分鐘內檢查事件日誌中的變化並作出相應的反應。PowerShell:在while循環中檢查錯誤?

由於我的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 

} 

我想我可以改變我的計劃任務運行每一分鐘,但到目前爲止,這個循環似乎一直很好。只是想在循環激活時引入錯誤檢查。

+0

嘗試我喜歡的PS奧祕的位:(!$?)如果 – EBGreen 2013-02-11 18:31:17

回答

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 StopStart-Process線。至於說,憑據應當終止錯誤,這使erroraction參數不必要

編輯你爲什麼要使用Start-Process在首位運行的腳本?我將它切換到Invoke-Command遠程運行powershell腳本。當腳本文件丟失時,您將收到一個非終止錯誤。由於這是一個非終止錯誤,我們需要使用-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 $_ 
    } 
} 
+0

我會如何處理丟失文件或其他常見錯誤?我假設一個丟失的文件也是一個終止錯誤,所以應該在沒有'-ErrorAction'的情況下被捕獲。我將try/catch塊添加到我的腳本並更改了文件名。然後我把它設置爲通過電子郵件通知我。它從未發送過。我添加了「Write-Error $ _。message」,並且屏幕上沒有任何內容。我只是試圖調試,如果這是工作。 – Pat 2013-02-11 18:51:17

+0

更新:如果帳戶的密碼無效,此功能無效。我們如何也能夠找到丟失的文件?當它能夠'毫無問題地啓動 - 處理powershell'時,它不會感覺到錯誤。該錯誤發生在次級PowerShell窗口中。 – Pat 2013-02-11 19:27:02

+0

查看更新的答案 – 2013-02-11 19:41:35

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 
} 
+0

此捕捉憑證無效的偉大工程。下一個問題:是否也可能捕獲缺少的文件名?當它能夠'毫無問題地啓動 - 處理powershell'時,它不會感覺到錯誤。 – Pat 2013-02-11 19:31:36

+0

如果使用-file參數而不是命令,它會更好嗎? – mjolinor 2013-02-11 20:18:11