powershell - Powershell 可执行文件未输出到 STDOUT
问题描述
从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
运行控制台程序,异步。
如果该程序快速完成,您可能会看到新的控制台窗口仅短暂闪烁,因为它随后会打开和关闭,或者您可能完全错过闪烁 - 无论哪种方式,它的输出都不会显示在调用者的控制台窗口中。
添加-Wait
到Start-Process
调用将使调用同步,添加-NoNewWindow
将使其在同一个控制台中运行,但调用 PowerShell 会话将无法捕获或重定向被调用程序的输出 - 见下文。
退一步:如果你想同步运行控制台程序,不要使用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 输出:
要捕获标准输出输出,只需将调用分配给一个变量:
$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。
注意:当 PowerShell 与外部程序通信时,字符编码问题开始发挥作用:有关详细信息,请参阅此答案。
[1] 或底层 .NET API System.Diagnostics.Process
,.
有关何时合适或不合适的指导,请参阅GitHub 文档问题 #6239Start-Process
推荐阅读
- python - Numpy数组中两个“岛”/“连接组件”之间的成对距离
- python - 在 jupyter notebook 中导入 pymc3 的问题
- android - Android Theme Style 以编程方式查找并读取正确的属性
- android - 我已经在 Android 应用程序中通过 webrtc 完成了摄像头流共享,但现在我需要与远程对等方共享屏幕
- reactjs - 收到错误:无效的挂钩调用。钩子只能在反应打字稿中的函数体内调用
- android - 具有动态项目数的Android Recyclerview
- wso2 - APICreator 用户无法登录到 WSO2 API Publisher 3.1.0
- css - 覆盖角mat-tab的css
- codenameone - 使用 Codename One 向图像添加重复的文本水印
- db2 - OpenShift 上的 Db2