【问题标题】:Getting command output from Invoke-Command从 Invoke-Command 获取命令输出
【发布时间】:2015-03-24 10:19:48
【问题描述】:

我正在尝试使用 Invoke-Command 在多台机器上远程运行 PowerShell 中的命令,并从中捕获它们的输出,但我没有从中获得任何输出。我怀疑这是因为我使用 Start-Process 的方式,但我不确定。

$RunCommand = {
    Start-Process "$env:ProgramFiles\Some Program\someprogram.exe" -ArgumentList "-SignatureUpdate"
}

$comp_list = @(Get-Content "c:\temp\comp_list.txt")
$cred = Get-Credential

$jobs = Invoke-Command -Credential $cred -Computer $comp_list -ScriptBlock $RunCommand -AsJob

Wait-Job $jobs
$r = Receive-Job $jobs
$r | % { $_ > c:\temp\$($_.PScomputerName).output }

有没有更好的方法来使用类似的环境变量调用命令?

【问题讨论】:

  • 这可能是一个错字,但不应该是Invoke-Command -ComputerName 而不仅仅是-computer
  • -Computer-ComputerName 的别名,所以两者都可以正常工作。
  • 啊,应该想到了。您是否尝试过使用$ExecutionContext.InvokeCommand.NewScriptBlock() 创建脚本块。我已将其与 Invoke-Ssh 命令一起使用

标签: powershell


【解决方案1】:

我发现Start-Process 可能不是从二进制文件中捕获输出的最佳方式,除非二进制文件本身传递 .NET 对象。我确实发现对此效果更好的是call operator

$RunCommand = {
    $exe = "$env:ProgramFiles\Some Program\someprogram.exe"
    & $exe -SignatureUpdate
}

我仍然没有得到我期望的输出。更具体地说,我只得到命令的最后一行输出,而不是整个输出。最终我意识到前面的所有行都被覆盖了,所以我将最后一行更改为:

$r | % { $_ >> c:\temp\$($_.PScomputerName).output }

注意:我将 > 更改为 >> 以附加到文件中。

【讨论】:

  • 请注意,这样做的缺点是重新运行脚本会导致它附加到同一个文件的末尾而不是创建一个新文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多