【问题标题】:in powershell how do I grab command output while piping a variable into the command?在 powershell 中,如何在将变量传递到命令中时获取命令输出?
【发布时间】:2014-03-19 19:13:50
【问题描述】:

是否有将控制台输出重定向到变量(不是文件)的 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 是一个表达式)。很明显我错过了一些东西!请问有什么办法? 谢谢

【问题讨论】:

    标签: powershell redirect


    【解决方案1】:

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

    $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

    【讨论】:

    • 非常感谢邓肯 - 这就是答案!它得到了我一直在摸索的东西。非常感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多