从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
你有没有想过为什么没有出现这种情况
正如Ansgar的评论所暗示的那样:在Windows上,
Start-Process
在新的控制台窗口中运行控制台程序,默认情况下,异步如果该程序很快完成,您可能只会看到新的控制台窗口短暂闪烁,因为它随后很快就会打开和关闭,或者您可能会完全错过闪烁-无论哪种方式,它的输出都不会显示在调用方的控制台窗口中
将
-Wait
添加到Start-Process
调用将使调用同步,添加-NoNewWindow
将使其在同一控制台中运行,但调用PowerShell会话将无法捕获或重定向被调用程序的输出-请参见下文。退一步:如果要同步运行控制台程序,且其标准流连接到PowerShell的流,请不要使用
Start-Process
[1]-直接调用此类程序:如果外部程序的路径/名称必须是引号(因为其路径包含空格)和/或存储在变量中,只需使用调用操作符
&
调用它:使用直接调用方法可以免费同步执行,还可以捕获和/或重定向被调用程序的stdout和stderr流
综合起来(根据您以后的评论):
这将在打印
done
(在Microsoft Windows 10 Pro上的Windows PowerShell v5.1.17134.48上验证(64位;1709版,操作系统版本:16299.371))之前,打印本文撰写时的版本号可选读取:从外部程序捕获stdout/stderr输出:
要捕获stdout输出,只需将调用分配给变量:
$version
如果只有一行输出,则接收字符串标量(单个字符串),或者接收表示输出行的字符串数组要同时捕获stderr输出,请使用重定向
2>&1
:注意对
[string[]]
的强制转换,它确保stderr行也被捕获为字符串默认情况下,它们被捕获为
[System.Management.Automation.ErrorRecord]
实例,在Windows PowerShell中,这些实例将有点令人困惑地打印它们,就像它们是PowerShell错误一样-此问题已在PowerShell核心中修复相反,如果不将返回的数组元素类型转换为字符串,则可以使用
-is [System.Management.Automation.ErrorRecord]
检查每个元素,以确定它是来自stdout还是stderr[1]或底层的.NET API,^{} 。
相关问题 更多 >
编程相关推荐