2009-12-04 63 views
4

我有一個小文件將文件複製到遠程機器列表。在這個腳本中使用:PowerShell腳本 - 如何處理執行命令的結果

Copy-Item "$AppLocation\$AppName" -destination "\\$MachineName\c$\" -force

這可以引發不同類型的錯誤。如果這引發錯誤,我想將錯誤記錄到文件中,然後繼續。我的問題是,我想知道什麼是正確的方法來確定Copy-Item命令是否成功。

下一個問題是相關的:

psexec \\$MachineName -u $RemoteLogin -p $Remotepassword -s -i -d C:\$AppName

什麼是找出如何執行的命令的好辦法?我在控制檯中收到一條消息,它以0退出,但我不知道如何將返回代碼放入局部變量。

我也可以使用此:
(Get-WMIObject -ComputerName $MachineName -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install("C:\$AppName","","false")
的正常工作,不過,不知道如何找出如果成功,除非我讀的輸出。

謝謝!

+0

有關於它的來源的任何全樣本? – Kiquenet 2012-05-24 10:15:05

回答

2

關於你問題的第一部分,你可以使用

Copy-Item ... -ErrorAction Continue -ErrorVariable yourVariable 

錯誤行動通知此cmdlet做什麼,如果錯誤的情況下,ErrorVariable會把任何錯誤在您所選擇的變量($ yourVariable在例如)。

$?自動變量包含上次操作的執行狀態。如果它是錯誤的,只要檢查$ yourVariable的內容就可以知道出了什麼問題,然後用它做任何你想做的事情(比如把它寫在你的案例中的一個文件中)。

您還可以使用

Copy-Item ... -ErrorAction Continue 2> [pathToLogFile] 

這將重定向cmdlet來您所選擇的文件的錯誤流...

關於你問題的第二部分:$ LASTEXITCODE包含返回你最後的可執行文件的代碼

您是否考慮過使用Powershell 2的遠程處理功能進行更多控制?

希望它可以幫助

塞德里克

+1

太棒了!非常感謝。使用谷歌的權力,我發現更多關於ErrorVariable,現在我使用它是這樣的: $ err = @() Copy-Item ... -ErrorAction繼續-ErrorVariable + err 這很有效。 – flayn 2009-12-04 13:53:47

+1

如果認爲在使用它之前不需要初始化變量,那麼這個。 考慮閱讀關於通用參數,自動變量和特定變量(如$ ErrorActionPreference):這會幫助你很多 – 2009-12-04 14:29:02

1

有很多問題。

這裏的東西我已經做了閱讀從控制檯應用程序的結果一樣PSEXEC:

 
    [System.Diagnostics.ProcessStartInfo]$info = New-Object System.Diagnostics.ProcessStartInfo 
    $info.WorkingDirectory = "C:\" 
    $info.UseShellExecute = $false 
    $info.RedirectStandardOutput = $true 
    $info.CreateNoWindow = $true 
    [System.Diagnostics.Process]$proc = [System.Diagnostics.Process]::Start($info) 

    if (($proc -ne $null) -and ($proc.id -ne 0)) { [void]$proc.WaitForExit($timeOutMs); } 
    $proc.StandardOutput.ReadToEnd(); 

。注意,這是未經測試的代碼,但它會從一些作品來了,我只是做了簡單一點編輯。

現在,您可以處理psexec的文本輸出並進行相應處理。

0

我使用powershell腳本來刪除舊文件。這會向屏幕輸出一條消息,這很容易將消息寫入事件日誌。 Details here

可以使用Write-EventLog命令寫入事件日誌。關於on MSDNTechNet的詳細信息。這方面的信息也出現在in the search engines之中。

2

使用嘗試,趕上遵循

$ErrorActionPreference='Stop' 
Try{ 
Write-Host "Finished OK" 
} 
Catch [system.exception] 
{ 
    Write-Host "Finished with Error" 
    Write-Host $_.Exception.ToString() 
    exit -1 
} 
相關問題