从exe文件启动进程中的命令行命令输出



这是程序。我正在使用dell命令|configure。命令行命令如下:

"C:Program Files (x86)DellCommand ConfigureX86_64>cctk.exe" --wakeonlan

在Powershell中,您可以导航到文件夹并运行:

./cctk.exe --wakeonlan

我可以将上面的命令管道传输到一个变量中,并获得我需要的信息。这需要我的shell相应地cd到文件夹中并相应地运行。

$test = ./cctk.exe --wakeonlan

这将为您提供输出。然而,当您使用启动进程时,您不会得到任何输出,因为这是一个命令行命令。出现cmd屏幕并运行命令。所以,我添加了-nonewwindow和-wait标志。输出现在出现在屏幕上,但我似乎无法捕捉到它

$test = start-process "C:Program Files (x86)DellCommand ConfigureX86_64cctk.exe" -ArgumentList @("--wakeonlan") -NoNewWindow -Wait

此时测试为空。我也尝试使用输出文件来捕获信息。没有成功。命令输出到屏幕,但不输出到其他地方。

我还尝试了cmd方法,在该方法中,您可以使用/C标志来传送信息。

$test = Start-Process cmd -ArgumentList '/C start "C:Program Files (x86)DellCommand ConfigureX86_64cctk.exe" "--wakeonlan"' -NoNewWindow -Wait

然而,我尝试了这个命令的许多变体,但都没有成功。有人说C:\程序无法识别。有些只是打开命令提示符。上面说——wakeonlan是一个未知的命令。

任何指示都会大有帮助。

有多种方法可以在不增加启动过程复杂性的情况下运行此程序。

临时添加到路径:

$env:path += ';C:Program Files (x86)DellCommand ConfigureX86_64;'
cctk

呼叫操作员:

& 'C:Program Files (x86)DellCommand ConfigureX86_64cctk'

所有空格和括号后引号:

C:Program` Files` `(x86`)DellCommand` ConfigureX86_64cctk

详细介绍js2010的有用答案:

简而言之:由于语法的原因,您的可执行路径是引号,因此直接调用需要使用调用运算符&-有关详细信息,请参阅此答案。

若要同步执行控制台应用程序或批处理文件并捕获其输出,请直接调用($output = c:pathtosome.exe ...$output = & $exePath ...(,不使用使用Start-Process或其所基于的System.Diagnostics.ProcessAPI-有关详细信息,请参阅此答案。

如果您确实使用Start-Process,这在特殊情况下可能是必要的,例如需要使用不同的用户标识运行

  • 捕获输出的唯一方法是通过-RedirectStandardOutput/-RedirectStandardError参数在文本文件中。请注意,输出文件的字符编码由存储在[Console]::OutputEncoding[1]中的编码决定,该编码反映了当前控制台输出代码页,默认为系统的活动遗留OEM代码页。

  • 相比之下,即使使用-NoNewWindow -Wait使用$output = ...直接捕获输出也不会工作,因为启动的进程直接将写入控制台,绕过PowerShell的成功输出流,这是一个变量赋值捕获。


[1]PowerShell在直接调用中使用相同的编码来解码外部程序的输出-有关详细信息,请参阅此答案

最新更新