Powershell可执行文件未输出到STDOUT

时间:2018-07-13 21:44:19

标签: powershell

从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 个答案:

答案 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