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

时间:2009-12-04 12:55:05

标签: powershell install psexec

我有一个小文件,可以将文件复制到远程计算机列表中。在这个脚本中我使用:

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")
哪个工作正常,但仍然不知道如何成功,除非我读取输出。

谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

错误操作告诉cmdlet如果出现错误,该怎么办,ErrorVariable会在您选择的变量中放置任何错误(例如$ yourVariable)。

$? automatic变量包含上一次操作的执行状态。如果它是假的,只需检查$ yourVariable的内容就可以知道出了什么问题,并用它做任何你想做的事情(比如在你的情况下把它写在一个文件中)。

您也可以使用

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

这会将cmdlet的错误流重定向到您选择的文件...

关于问题的第二部分:$ LASTEXITCODE包含上一个可执行文件的返回码。

您是否考虑过使用Powershell 2的远程处理功能来进行更多控制?

希望有所帮助

和Cédric

答案 1 :(得分: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 :(得分: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的文本输出并进行相应处理。

答案 3 :(得分:0)

我使用powershell脚本删除旧文件。这会向屏幕输出一条消息,这可以很容易地将消息写入事件日志。 Details here

可以使用Write-EventLog命令写入事件日志。有关on MSDNTechNet的详细信息。对此也会出现大量信息{。{3}}。