gpt4 book ai didi

Powershell 可执行文件未输出到 STDOUT

转载 作者:行者123 更新时间:2023-12-02 23:08:30 25 4
gpt4 key购买 nike

从 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 .

关于为什么这不显示的任何想法?

最佳答案

正如 Ansgar 的评论所暗示的那样:在 Windows 上,Start-Process默认情况下,在新的控制台窗口中异步运行控制台程序。
如果该程序快速完成,您可能会看到新的控制台窗口只是短暂闪烁,因为它随后很快就会打开和关闭,或者您可能完全错过了闪烁 - 无论哪种方式,其输出都不会显示在调用者的控制台窗口中。
添加 -WaitStart-Process调用将使调用同步,并添加 -NoNewWindow将使其在同一个控制台中运行,但调用 PowerShell session 将无法捕获或重定向被调用程序的输出 - 见下文。
退一步:请勿使用 Start-Process [1] 如果你想同步运行一个控制台程序,它的标准流连接到 PowerShell 的流 - 直接调用这样的程序:

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
使用直接调用方法可以免费同步执行,并且能够捕获和/或重定向被调用程序的 stdout 和 stderr 流。

把它们放在一起(根据你后来的评论):
nuget install mdoc -OutputDirectory packages -ExcludeVersion

$exePath = "packages/mdoc/tools/mdoc.exe"

& $exePath --version

"done"
这将打印版本号 - mdoc 5.7.2在撰写本文时 - 打印前 done (已在 Microsoft Windows 10 Pro(64 位;版本 1709,操作系统内部版本:16299.371)上的 Windows PowerShell v5.1.17134.48 上验证)。

可选阅读:从外部程序捕获 stdout/stderr 输出:
要捕获 stdout 输出,只需将调用分配给一个变量:
$version = & $exePath --version  # $version receives stdout output as an *array of lines*
$version如果只有 1 行输出,则接收字符串标量(单个字符串),或表示输出行的字符串数组。
要同时捕获 stderr 输出,请使用重定向 2>&1 :
[string[]] $allOutput = & $exePath --version 2>&1
请注意转换为 [string[]] ,这确保 stderr 行也被捕获为字符串。
  • 默认情况下,它们被捕获为 [System.Management.Automation.ErrorRecord]实例,这在 Windows PowerShell 中会有些困惑地打印它们,好像它们是 PowerShell 错误 - 此问题已在 PowerShell Core 中修复。
  • 但是,相反,如果不将返回的数组元素的类型转换为字符串,则可以使用 -is [System.Management.Automation.ErrorRecord] 检查每个元素。以确定它是源自 stdout 还是 stderr。

  • [1] 或者底层.NET API, System.Diagnostics.Process .

    关于Powershell 可执行文件未输出到 STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333183/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com