【问题标题】:How to get PowerShell to keep a command window open?如何让 PowerShell 保持命令窗口打开?
【发布时间】:2012-03-03 21:30:36
【问题描述】:

当我在 PowerShell 上运行程序时,它会打开一个新窗口,在我看到输出之前,该窗口会关闭。如何使 PowerShell 保持此窗口打开?

【问题讨论】:

  • 这个程序是exe还是批处理文件?你能给出你正在运行的确切命令,也许是更改可执行文件的名称?
  • 这是一个exe文件。我将程序所在的文件夹添加到我的路径中,当我输入它运行的程序的名称时,除了它打开的窗口关闭得太快,我无法阅读它所说的内容。该程序是一个测试python程序的程序。至于您在下面的评论,我不知道如何将程序包装在批处理文件中:/
  • 我更新了我的答案以阐明如何做到这一点。将程序输出重定向到文本文件也可能有意义。

标签: windows shell powershell


【解决方案1】:

尝试做:

start-process your.exe -NoNewWindow

如果需要,也添加-Wait

【讨论】:

  • 当我这样做时它告诉我“启动进程:由于错误无法执行此命令:系统找不到指定的文件。”这很奇怪,因为我将 exe 的位置添加到了我的路径中。
  • @Erman - 确保确实如此。如果需要,重新启动 Powershell。或者使用完整路径查看发生了什么。
  • @Erman 我想你想把 powershell.exe my.bat -NoNewWindow
  • 当我将 -NoNewWindow 参数添加到我的启动进程时,我得到了与 Erman 注释 1 中相同的错误,但是当我完全限定可执行文件时,它为我解决了错误,所以 start-process 'full path to\your.exe' -NoNewWindow,命令按预期运行。
【解决方案2】:

OP 似乎对答案感到满意,但在执行程序后它并没有保持新窗口打开,这似乎是他要问的(也是我正在寻找的答案)。所以,经过更多研究,我想出了:

Start-Process cmd "/c `"your.exe & pause `""

【讨论】:

  • PowerShell 纯粹主义者的另一种选择是使用 powershell 代替 cmd:Start-Process powershell "your.exe ; read-host 'Press Enter to continue'"
  • 我用这个:Start-Process "powershell" -wait -ArgumentList "tree 'D:' ; pause".
【解决方案3】:

几周前我正在解决一个类似的问题。如果您不想使用 & (& '.\program.exe'),那么您可以使用启动进程并按启动进程读取输出(您可以显式读取输出)。

只需将其作为单独的 PS1 文件 - 例如(或宏):

param (
    $name,
    $params
)

$process = New-Object System.Diagnostics.Process
$proInfo = New-Object System.Diagnostics.ProcessStartInfo
$proInfo.CreateNoWindow = $true
$proInfo.RedirectStandardOutput = $true
$proInfo.RedirectStandardError = $true
$proInfo.UseShellExecute = $false
$proInfo.FileName = $name
$proInfo.Arguments = $params
$process.StartInfo = $proInfo

#Register an Action for Error Output Data Received Event
Register-ObjectEvent -InputObject $process -EventName ErrorDataReceived -action {
    foreach ($s in $EventArgs.data) { Write-Host $s -ForegroundColor Red }
} | Out-Null

#Register an Action for Standard Output Data Received Event
Register-ObjectEvent -InputObject $process -EventName OutputDataReceived -action {
    foreach ($s in $EventArgs.data) { Write-Host $s -ForegroundColor Blue }
} | Out-Null

$process.Start() | Out-Null
$process.BeginOutputReadLine()
$process.BeginErrorReadLine()
$process.WaitForExit()

然后这样称呼它:

.\startprocess.ps1 "c:\program.exe" "params"

您还可以轻松地重定向输出或实现某种超时,以防您的应用程序可能冻结...

【讨论】:

  • 完美。正是我想要的。非常感谢。
  • 这是一种有趣的方法,并且它有效,只是外部进程创建的输出出现乱序。此外,脚本似乎没有等待进程结束才继续,因为我看到它的输出与外部命令的输出穿插在一起。
【解决方案4】:

如果程序是使用cmd /c foo.cmd 命令启动的批处理文件(.cmd 或 .bat 扩展名),只需将其更改为cmd /k foo.cmd 即可执行程序,但提示保持打开状态。

如果程序不是批处理文件,请将其包装在批处理文件中,并在其末尾添加pause 命令。要将程序包装在批处理文件中,只需将命令放在文本文件中并为其提供 .cmd 扩展名。然后执行它而不是exe。

【讨论】:

    【解决方案5】:

    使用 Startprocess 并在 $arguments 脚本块中,您可以放置​​一个 Read-Host

    $arguments = {
        "Get-process"
        "Hello"
        Read-Host "Wait for a key to be pressed"
      }
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多