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 调用中使用相同的编码来解码来自外部程序的输出 - 有关详细信息,请参阅 。
这是程序。我正在使用戴尔命令 |配置。命令行命令如下:
"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 调用中使用相同的编码来解码来自外部程序的输出 - 有关详细信息,请参阅