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

Command Line Command Output in start-process from exe file

这是程序。我正在使用戴尔命令 |配置。命令行命令如下:

"C:\Program Files (x86)\Dell\Command Configure\X86_64>cctk.exe" --wakeonlan

在 Powershell 中,您可以导航到该文件夹​​,然后 运行:

./cctk.exe --wakeonlan

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

$test = ./cctk.exe --wakeonlan

这会给你一个输出。但是,当您使用 start-process 时,您不会得到任何输出,因为这是一个命令行命令。一个 cmd 屏幕出现并且 运行s 命令。所以,我添加了 -nonewwindow 和 -wait 标志。输出现在出现在屏幕上,但我似乎无法捕获它。

$test = start-process "C:\Program Files (x86)\Dell\Command Configure\X86_64\cctk.exe" -ArgumentList @("--wakeonlan") -NoNewWindow -Wait

此时测试为空。我也尝试使用 Out-File 来捕获信息。没有成功。命令输出到屏幕,但无处输出。

我还尝试了 cmd 方法,您可以使用 /C 标志通过管道传输信息。

$test = Start-Process cmd -ArgumentList '/C start "C:\Program Files (x86)\Dell\Command Configure\X86_64\cctk.exe" "--wakeonlan"' -NoNewWindow -Wait

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

任何指点都会有很大帮助。

有多种方法可以运行这而不增加启动过程的复杂性。

临时加入路径:

$env:path += ';C:\Program Files (x86)\Dell\Command Configure\X86_64;'
cctk

呼叫运营商:

& 'C:\Program Files (x86)\Dell\Command Configure\X86_64\cctk'

反引号所有空格和括号:

C:\Program` Files` `(x86`)\Dell\Command` Configure\X86_64\cctk

详细说明

简而言之:因为你的可执行路径是引用,直接调用需要使用&call operator, for syntactic reasons - see 了解详情。

同步执行控制台应用程序或批处理文件并捕获它们的输出,请直接调用它们$output = c:\path\to\some.exe ...$output = & $exePath ...),使用Start-Process(或System.Diagnostics.Process API 它基于) - 请参阅 this answer 了解更多信息。

如果您使用 Start-Process,这在特殊情况下可能是必要的,例如需要 运行 与 不同用户身份:

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

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


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