在powershell中如何在将变量传递给命令时获取命令输出?

时间:2014-03-19 04:01:25

标签: powershell redirect

是否有一个powershell cmdlet可将控制台输出重定向到变量(不是文件)?

我需要将变量的内容传递给二进制文件的命令行,并在另一个变量中收集二进制文件的控制台响应,但无法弄清楚如何。

例如,当失败时,Perforce的p4.exe会返回OK状态,并显示文本错误消息

$MyP4Client | p4 client -i

要在出错时中止,我需要进行一次try / catch循环,然后从p4收集并检查控制台输出。 当没有涉及输入重定向时,我可以这样做以将p4的控制台输出变为变量:

Try {
    $P4response = & 'p4' sync -f //depot/myfiles/...   2>&1
}
Catch {
    ExitWithCode 1 # abort
}
if( $P4response -match "blah" ) {
    # act on p4 response text

但是我找不到将$ MyP4Client变量输入到p4二进制文件然后从p4获取输出的方法。在许多其他尝试中,这些都没有将p4的输出转换为$ P4response:

$P4response = $p4ClientSpec | & 'p4' client -i 
$P4response = ( $p4ClientSpec | p4 client -i )
$P4response = { $p4ClientSpec | & 'p4' client -i }
$p4ClientSpec | & 'p4' "client -i" | $P4response  

最后一个得到解析器错误($ P4response是一个表达式)。很明显我错过了什么!请问有什么用? 感谢

3 个答案:

答案 0 :(得分:2)

您的问题意味着您正在尝试将输出捕获到stderr以及stdout。这应该有效:

$P4response = ( $p4ClientSpec | p4 client -i  2>&1 )

您将从变量中的控制台应用程序中获取stdout和stderr,但您可以非常轻松地将它们分开:

$output = $P4Response | Where-Object { $_.GetType() -ne [System.Management.Automation.ErrorRecord] }
$errors = $P4Response | Where-Object { $_.GetType() -eq [System.Management.Automation.ErrorRecord] }

然后您只需检查非空$errors

答案 1 :(得分:0)

尝试使用Tee-Object cmdlet。它将命令输出保存在文件或变量中,并将其发送到管道中。 Technet上的文档。

答案 2 :(得分:0)

如果可执行文件实际上是将错误写入stderr,那么您现在已经尝试过已经尝试过的错误了。如果它只是直接将消息写入控制台,那么您唯一的选择可能是使用Start-Transcript将控制台输出捕获到文件,并解析文件内容以查找该消息。