从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
。
有什么想法为什么没有出现?
答案 0 :(得分:2)
正如Ansgar的评论所暗示的:在Windows上,Start-Process
默认在新控制台窗口中运行控制台程序 ,异步。
如果该程序快速完成,则您可能会看到新的控制台窗口仅短暂闪烁(此后此后即会打开并关闭),或者您可能完全错过了该闪烁-两种方式,其输出都不会显示在调用方的控制台窗口。
将-Wait
添加到Start-Process
调用中将使调用同步,而添加-NoNewWindow
则将使其在相同的中运行控制台,但是调用PowerShell会话将无法捕获或重定向所调用程序的输出-见下文。
退后一步:如果要同步运行控制台程序,并且将其标准流连接到PowerShell的流Start-Process >-只需直接 调用该程序:
packages/mdoc/tools/mdoc.exe --version
如果必须在外部程序的路径/名称中加上 (因为其路径包含空格)和/或将其存储在变量中,只需使用{{1} }(调用运算符)来调用它:
&
使用直接调用方法可以使您免费同步执行,还可以捕获和/或重定向被调用程序的stdout和stderr流。
将它们放在一起(根据您以后的评论):
# 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
(在撰写本文时)(已在Microsoft Windows 10 Pro(64位; 1709版,在Windows PowerShell v5.1.17134.48上进行了验证,操作系统内部版本:16299.371)。
可选阅读:捕获外部程序的stdout / stderr输出:
要捕获 stdout 输出,只需将调用分配给变量:
done
$version = & $exePath --version # $version receives stdout output as an *array of lines*
如果仅输出1行,则接收字符串标量(单个字符串),或者表示输出行的字符串数组。
要同时捕获 stderr 输出,请使用重定向$version
:
2>&1
请注意强制转换为[string[]] $allOutput = & $exePath --version 2>&1
,以确保将stderr行也捕获为 strings 。
默认情况下,它们被捕获为[string[]]
实例,这些实例在 Windows PowerShell 中会有些混乱地打印它们,就像它们是 PowerShell 错误一样-此问题已在PowerShell Core 中得以解决。
相反,如果您不将返回的数组元素的类型转换为字符串,则可以使用[System.Management.Automation.ErrorRecord]
检查每个元素以确定它是源自stdout还是stderr