Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell可执行文件isn';t输出到标准输出_Powershell - Fatal编程技术网

Powershell可执行文件isn';t输出到标准输出

Powershell可执行文件isn';t输出到标准输出,powershell,Powershell,从powershell脚本(安装了nuget并在路径上),我正在尝试执行一个可执行文件(.net,如果需要的话)。。。但由于某些原因,我无法使标准输出显示在命令窗口中 nuget install mdoc -OutputDirectory packages -ExcludeVersion start-process "packages/mdoc/tools/mdoc.exe" "--version" echo "done" 这应该输出MDOC5.7.2(在本文发布时,为当前版本)。但是您将

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

nuget install mdoc -OutputDirectory packages -ExcludeVersion

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

echo "done"
这应该输出
MDOC5.7.2
(在本文发布时,为当前版本)。但是您将看到nuget输出,然后
done


关于为什么没有出现这种情况有什么想法吗?

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

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

-Wait
添加到
启动进程
调用将使调用同步,添加
-nonewindow
将使调用在同一控制台中运行,但调用PowerShell会话将无法捕获或重定向被调用程序的输出-请参阅下文

退一步:如果要同步运行控制台程序,且其标准流连接到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流


综合起来(根据您以后的评论):

这将在打印完成之前打印版本号-
mdoc 5.7.2
(在Microsoft Windows 10 Pro上的Windows PowerShell v5.1.17134.48上验证(64位;1709版,操作系统版本:16299.371))


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

packages/mdoc/tools/mdoc.exe --version
要捕获标准输出,只需将调用分配给变量:

$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 Core中修复

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


启动流程-非Windows
?或者,您可以直接运行程序,而无需
启动进程
&“packages/mdoc/tools/mdoc.exe”--版本
。我不明白为什么这么多人认为您必须使用
启动进程
,才能让PowerShell运行可执行文件。这似乎是一个广泛传播的误解。@AnsgarWiechers和@Bill_Stewart我应该清楚的。。。我尝试使用<代码>和<代码>符号执行程序,得到相同的结果。但是,我也尝试添加<代码> -> 和<代码> -NoeWwindows > /Cord>,如果没有得到完整的回答,请考虑回答或提供反馈。您的问题举例说明了一个常见的误解,即控制台程序应该如何在PowerShell中运行,因此我经常链接到它。如果答案被接受,那会有帮助的。