PowerShell脚本 - 如何处理执行命令的结果

4
我有一个小脚本,将文件复制到远程机器列表中。在这个脚本中,我使用以下命令: 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") 这也可以正常工作,但是,我仍然不知道如何找出它是否成功,除非我读取输出。
谢谢!

有没有任何关于它的完整示例源代码? - Kiquenet
4个回答

2

请按以下方式使用Try和Catch

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

2
关于您问题的第一部分,您可以使用


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

错误操作指示了命令行工具在出现错误时应该做什么,ErrorVariable会将任何错误放入你选择的变量中(例如$yourVariable)。

$?自动变量包含了最后一次操作的执行状态。如果它是false,只需检查$yourVariable的内容就可以知道出了什么问题,并且可以按照需要进行处理(例如将其写入文件)。

你也可以使用

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

这将会把cmdlet的错误流重定向到您选择的文件中...
关于您问题的第二部分:$LASTEXITCODE 包含了您上一个可执行程序的返回代码。
您是否考虑过使用Powershell 2的远程控制功能以获得更多的控制权?
希望这有所帮助。
Cédric

1
太棒了!非常感谢。借助谷歌的力量,我对ErrorVariable有了更多了解,现在我像这样使用它: $err=@() Copy-Item ... -ErrorAction Continue -ErrorVariable +err 这个方法非常有效。 - flayn
1
如果你认为在使用变量之前不需要初始化它,那么请考虑阅读关于常见参数、自动变量和特定变量(如$ErrorActionPreference)的相关资料:这将对你有很大帮助。 - Cédric Rup

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脚本删除旧文件。这会在屏幕上输出一条消息,也可以将消息写入事件日志中。详情请点击此处

使用Write-EventLog命令可以将消息写入事件日志中。有关此命令的详细信息,请参阅MSDNTechNet。搜索引擎中也有大量相关信息可供查询


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接