在powershell中,我如何获取命令输出,同时将变量管道到命令中



是否有一个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将控制台输出捕获到一个文件,然后解析文件内容查找该消息。

最新更新