是否有一个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是一个表达式)。很明显我错过了什么!请问有什么用? 感谢
答案 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将控制台输出捕获到文件,并解析文件内容以查找该消息。