代码之家  ›  专栏  ›  技术社区  ›  Joel Martinez

Powershell可执行文件未输出到STDOUT

  •  1
  • Joel Martinez  · 技术社区  · 6 年前

    从powershell脚本(使用 nuget 安装并在路径上),我正在尝试执行可执行文件(.net,如果这很重要的话)。。。但由于某种原因,我无法让STDOUT显示在命令窗口中。

    nuget install mdoc -OutputDirectory packages -ExcludeVersion
    
    start-process "packages/mdoc/tools/mdoc.exe" "--version"
    
    echo "done"
    

    这个 应该 输出 mdoc 5.7.2 (在本文发表时,为当前版本)。但是你会看到nuget输出,然后 done

    有没有想过为什么没有出现?

    1 回复  |  直到 6 年前
        1
  •  2
  •   mklement0    6 年前

    正如Ansgar的评论所暗示的:在Windows上, Start-Process 运行控制台程序 默认情况下, 异步 .

    来电者 控制台窗口。

    -Wait 启动进程 调用将调用 ,并添加 -NoNewWindow 会让它跑起来的 在同一控制台中 捕获或重定向

    后退一步: 启动进程 同步地 ,以及 -只要调用这样的程序 直接地 :

    packages/mdoc/tools/mdoc.exe --version
    

    如果外部程序的路径/名称必须是 引用 变量 & ,调用它:

    # Via a quoted string:
    & "packages/mdoc/tools/mdoc.exe" --version
    
    # Via a variable:
    $exePath = "packages/mdoc/tools/mdoc.exe"
    & $exePath --version
    


    要将所有内容组合在一起(基于您稍后的评论):

    nuget install mdoc -OutputDirectory packages -ExcludeVersion
    
    $exePath = "packages/mdoc/tools/mdoc.exe"
    
    & $exePath --version
    
    "done"
    

    打印版本号- mdoc 5.7.2 在写作之前-就在印刷之前 done


    可选阅读: 捕捉

    捕捉 标准输出 输出,只需将调用分配给变量:

    $version = & $exePath --version  # $version receives stdout output as an *array of lines*
    

    $version 如果只有一行输出,则接收字符串标量(单个字符串),或者 表示输出行的字符串。

    同时捕获 标准错误 输出,使用重定向 2>&1 :

    [string[]] $allOutput = & $exePath --version 2>&1
    

    注意演员 [string[]] 我也是。

    • 默认情况下,它们被捕获为 [System.Management.Automation.ErrorRecord] 实例,其中 Windows PowerShell 会有点混乱地打印出来 PowerShell 核心 .

    • -is [System.Management.Automation.ErrorRecord] 以确定它是源于stdout还是stderr。