【问题标题】:Command Line Command Output in start-process from exe fileexe文件的启动过程中的命令行命令输出
【发布时间】:2022-01-03 01:41:16
【问题描述】:

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

"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 屏幕并运行该命令。因此,我添加了 -nonewwindow 和 -wait 标志。输出现在出现在屏幕上,但我似乎无法捕捉到它。

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

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

我还尝试了使用 /C 标志传递信息的 cmd 方法。

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

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

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

【问题讨论】:

    标签: powershell command-line start-process powershell-5.1


    【解决方案1】:

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

    暂时添加到路径中:

    $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
    

    【讨论】:

    • 这个很有用。
    【解决方案2】:

    详述js2010's helpful answer

    简而言之:因为您的可执行路径被引用,直接调用需要使用&,即call operator,用于语法原因 - 详情请参阅this answer

    同步执行控制台应用程序或批处理文件并捕获它们的输出,直接调用它们$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 调用中使用相同的编码来解码来自外部程序的输出 - 有关详细信息,请参阅 this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2021-11-07
      相关资源
      最近更新 更多