我有一个小文件,可以将文件复制到远程计算机列表中。在这个脚本中我使用:
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 :(得分: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 MSDN和TechNet的详细信息。对此也会出现大量信息{。{3}}。