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")
它工作正常,但仍然不知道如何确定它是否成功,除非我阅读输出。

谢谢!

4

4 回答 4

2

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

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

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

美元?自动变量包含上次操作的执行状态。如果它是错误的,只需检查 $yourVariable 的内容就知道出了什么问题,然后用它做任何你想做的事情(比如在你的情况下将它写在一个文件中)。

你也可以使用

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

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

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

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

希望能帮助到你

塞德里克

于 2009-12-04T13:07:13.017 回答
2

使用 Try 和 catch 如下

$ErrorActionPreference='Stop'
Try{
Write-Host "Finished OK"
}
Catch [system.exception]
{
    Write-Host "Finished with Error"
    Write-Host $_.Exception.ToString()
    exit -1
}
于 2012-06-22T09:09:10.660 回答
1

你的问题有很多。

这是我为从 psexec 等控制台应用程序读取结果所做的事情:

    [System.Diagnostics.ProcessStartInfo]$info = 新对象 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 的文本输出并进行相应处理。

于 2009-12-04T13:06:24.160 回答
0

我使用 powershell 脚本删除旧文件。这会将消息输出到屏幕,这可以很容易地将消息写入事件日志。详情在这里

可以使用 Write-EventLog 命令写入事件日志。关于 MSDNTechNet的详细信息。搜索引擎中也会为此提供大量信息。

于 2009-12-04T13:06:58.727 回答