是否有一个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是一个表达式)。很明显我错过了什么!请问什么能起作用?由于
您的问题暗示您正在尝试捕获标准输出和标准输出。这应该可以工作:
$P4response = ( $p4ClientSpec | p4 client -i 2>&1 )
你将从控制台应用程序的变量中获得标准输出和标准错误,但是你可以很容易地将它们分开:
$output = $P4Response | Where-Object { $_.GetType() -ne [System.Management.Automation.ErrorRecord] }
$errors = $P4Response | Where-Object { $_.GetType() -eq [System.Management.Automation.ErrorRecord] }
然后检查非空的$errors
尝试Tee-Object
cmdlet。它将命令输出保存在文件或变量中,并将其发送到管道中。
如果可执行文件实际上是将错误写入stderr,那么看起来您现在已经尝试过了。如果只是直接向控制台写入消息,那么您唯一的选择可能是使用Start-Transcript将控制台输出捕获到一个文件,然后解析文件内容查找该消息。