代码之家  ›  专栏  ›  技术社区  ›  flayn

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

  •  4
  • flayn  · 技术社区  · 16 年前

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

    Copy-Item "$AppLocation\$AppName" -destination "\\$MachineName\c$\" -force

    这会引发各种类型的错误。如果这引发了一个错误,我希望将该错误记录到一个文件中,然后继续。我的问题是,我想知道什么是正确的方法来确定复制项命令是否成功。

    下一个问题是相关的:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Cédric Rup    16 年前

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

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

    错误操作告诉Cmdlet如果出现错误,ErrorVariable将在您选择的变量中放入任何错误(示例中为your variable)。

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

    您也可以使用

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

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

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

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

    希望有帮助

    C语言

        2
  •  2
  •   Eddietec    14 年前

    按如下方式使用“尝试并捕获”

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

    你的问题很多。

    以下是我从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的文本输出并进行相应的处理。

        4
  •  0
  •   Tim Cooper    15 年前

    我使用PowerShell脚本删除旧文件。这将向屏幕输出一条消息,这同样可以轻松地将消息写入事件日志。 Details here .

    可以使用write event log命令写入事件日志。很好的细节 on MSDN 和 TechNet . 出现大量信息 in the search engines 对此也是如此。

    推荐文章