【问题标题】:Store command with multi line output to variable or file in Powershell将具有多行输出的命令存储到 Powershell 中的变量或文件
【发布时间】:2020-08-31 15:23:40
【问题描述】:

我正在尝试将命令提示符命令存储到 Powershell 中的变量中,并将其输出到文件中。由于该命令有 3 行输出,因此没有任何内容被存储为变量或写入文件。当我尝试存储或输出到文件时,唯一发生的事情就是输出被打印到屏幕上。

输入:

java -version

输出:

java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b25)
Java HotSpot(TM) Client VM (build 25.251-b25, mixed mode)

我尝试了以下方法,但没有成功:

$variable = (java -version)
$variable = cmd /c "java -version")
java -version | out-file test.txt

【问题讨论】:

    标签: powershell output store


    【解决方案1】:

    看起来我看错了你的问题,底部的原始答案

    java.exe 可能会将版本信息输出到标准错误流,因此您必须先将其重定向到标准输出流:

    $version = java -version 2>&1
    

    但由于 PowerShell 会尝试将错误流的输出包装在 ErrorRecord 中,我们需要再次将它们转换回字符串:

    $version = java -version 2>&1 |ForEach-Object ToString
    

    要详细了解 PowerShell 中的不同输出流以及如何重定向它们,请参阅about_Redirection help topic


    要么将命令和参数存储在字符串变量中,然后使用& 调用:

    $command = 'java'
    $arguments = '-version'
    # ... later in the script:
    $javaVersion = & $command $arguments
    

    或者使用命令表达式创建一个脚本块:

    $javaVersionCommand = {
      java -version
    }
    # ... later in the script:
    $javaVersion = & $javaVersionCommand
    

    【讨论】:

    • 那么 2>&1 到底是什么意思呢?这似乎是完成这项工作的关键。
    • @Aaron 意思是“将推送到流 2(错误流)的数据合并到流 1(输出流)中”,我在相关文档中添加了链接也回答一下
    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2012-04-03
    相关资源
    最近更新 更多