将CMD风格的参数传递给Python中的命令 | 将PowerShell函数转换为Python 3,但我找不到易于理解的答案。
将CMD风格的参数传递给Python中的命令 | 将PowerShell函数转换为Python 3,但我找不到易于理解的答案。
通过一个已经安装了并且在路径中的 PowerShell 脚本,我试图执行一个可执行文件(如果这有关系的话,它是 .net 的)……但是出于某种原因,我无法在命令窗口中显示 STDOUT。
nuget install mdoc -OutputDirectory packages -ExcludeVersion start-process "packages/mdoc/tools/mdoc.exe" "--version" echo "done"
这应该输出 mdoc 5.7.2
(在发布这篇文章时,当前版本)。但你会看到 nuget 的输出,然后是 done
。
你对为什么没有显示出来有什么想法吗?
问题:如何将CMD风格的参数传递给Python中的命令,并将PowerShell函数转换为Python 3?
原因:在Windows上,默认情况下,使用Start-Process在新的控制台窗口中异步运行控制台程序。如果该程序很快完成,你可能只会看到新的控制台窗口闪烁一下,然后很快打开和关闭,或者你可能完全错过闪烁 - 无论哪种方式,其输出都不会显示在调用程序的控制台窗口中。使用- Wait参数可以使调用同步进行,并使用-NoNewWindow参数使其在同一个控制台中运行,但调用的PowerShell会话无法捕获或重定向所调用程序的输出。
解决方法:如果要同步运行控制台程序,并将其标准流连接到PowerShell的流,请不要使用Start-Process,而是直接调用该程序。如果外部程序的路径/名称必须带引号(因为其路径包含空格)和/或它存储在变量中,则可以使用&运算符进行调用。使用直接调用方法可以获得以下功能:同步执行,默认情况下捕获和/或重定向所调用程序的标准输出和标准错误流,可通过PowerShell的自动变量$LASTEXITCODE访问程序的进程退出代码。
所以解决方法是将CMD风格的参数传递给Python中的命令,可以直接调用该命令,并使用&运算符将其与参数一起传递。这样可以同步运行命令,并可以捕获和重定向其输出。在Windows PowerShell中,可以使用$LASTEXITCODE变量访问命令的退出代码。
在代码中,可以使用以下形式来调用外部程序:
& "packages/mdoc/tools/mdoc.exe" --version
如果外部程序的路径/名称必须带引号(因为其路径包含空格)和/或它存储在变量中,可以使用以下形式进行调用:
$exePath = "packages/mdoc/tools/mdoc.exe" & $exePath --version
使用直接调用方法可以实现同步执行,默认情况下捕获和/或重定向所调用程序的标准输出和标准错误流。可以通过PowerShell的$LASTEXITCODE变量访问程序的进程退出代码。在代码中,可以通过以下形式将所有步骤组合起来:
nuget install mdoc -OutputDirectory packages -ExcludeVersion $exePath = "packages/mdoc/tools/mdoc.exe" & $exePath --version "done"
如果要捕获外部程序的标准输出和标准错误输出,可以将调用赋值给一个变量,并使用重定向2>&1来捕获标准错误输出。注意要将捕获的标准错误输出转换为字符串数组,以便能够正确处理它们。如下所示:
$version = & $exePath --version # $version receives stdout output as an *array of lines*
[string[]] $allOutput = & $exePath --version 2>&1
注意:当PowerShell与外部程序通信时,会涉及字符编码问题。
要将CMD风格的参数传递给Python中的命令,并将PowerShell函数转换为Python 3,可以使用直接调用方法,并使用&运算符将命令与参数一起传递。这样可以同步运行命令,并可以捕获和重定向其输出。在Windows PowerShell中,可以使用$LASTEXITCODE变量访问命令的退出代码。