这是程序。我正在使用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.Process
API-有关详细信息,请参阅此答案。
如果您确实使用Start-Process
,这在特殊情况下可能是必要的,例如需要使用不同的用户标识运行:
-
捕获输出的唯一方法是通过
-RedirectStandardOutput
/-RedirectStandardError
参数在文本文件中。请注意,输出文件的字符编码由存储在[Console]::OutputEncoding
[1]中的编码决定,该编码反映了当前控制台输出代码页,默认为系统的活动遗留OEM代码页。 -
相比之下,即使使用
-NoNewWindow -Wait
,使用$output = ...
直接捕获输出也不会工作,因为启动的进程直接将写入控制台,绕过PowerShell的成功输出流,这是一个变量赋值捕获。
[1]PowerShell在直接调用中使用相同的编码来解码外部程序的输出-有关详细信息,请参阅此答案