2009-12-04 126 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 
}