Powershell可执行文件未输出到标准输出

2024-06-07 17:52:24 发布

您现在位置:Python中文网/ 问答频道 /正文

从powershell脚本(安装了nuget并且在路径上),我正在尝试执行一个可执行文件(.net,如果需要的话)。。。但由于某些原因,我无法使标准输出显示在命令窗口中

nuget install mdoc -OutputDirectory packages -ExcludeVersion

start-process "packages/mdoc/tools/mdoc.exe" "--version"

echo "done"

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

你有没有想过为什么没有出现这种情况


Tags: install命令路径脚本可执行文件标准netpackages
1条回答
网友
1楼 · 发布于 2024-06-07 17:52:24

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

如果该程序很快完成,您可能只会看到新的控制台窗口短暂闪烁,因为它随后很快就会打开和关闭,或者您可能会完全错过闪烁-无论哪种方式,它的输出都不会显示在调用方的控制台窗口中

-Wait添加到Start-Process调用将使调用同步,添加-NoNewWindow将使其在同一控制台中运行,但调用PowerShell会话将无法捕获或重定向被调用程序的输出-请参见下文。

退一步:如果要同步运行控制台程序,且其标准流连接到PowerShell的流,请不要使用Start-Process[1]-直接调用此类程序

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"

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


可选读取:从外部程序捕获stdout/stderr输出:

要捕获stdout输出,只需将调用分配给变量:

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

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

要同时捕获stderr输出,请使用重定向2>&1

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

注意对[string[]]的强制转换,它确保stderr行也被捕获为字符串

  • 默认情况下,它们被捕获为[System.Management.Automation.ErrorRecord]实例,在Windows PowerShell中,这些实例将有点令人困惑地打印它们,就像它们是PowerShell错误一样-此问题已在PowerShell核心中修复

  • 相反,如果不将返回的数组元素类型转换为字符串,则可以使用-is [System.Management.Automation.ErrorRecord]检查每个元素,以确定它是来自stdout还是stderr


[1]或底层的.NET API,^{}

相关问题 更多 >

    热门问题