如何使PowerShell保持命令窗口打开?

23
当我在PowerShell上运行程序时,它会打开一个新窗口,在我看到输出内容之前,这个窗口就自动关闭了。我该如何让PowerShell保持此窗口打开呢?

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

16

尝试执行以下操作:

start-process your.exe -NoNewWindow

如果需要,添加-Wait


2
当我执行此操作时,它告诉我:“Start-Process:由于错误无法执行此命令:系统找不到指定的文件。”这很奇怪,因为我已将exe文件的位置添加到了我的路径中。 - Erman
@Erman - 确保它确实是这样。如果需要,请重新启动 Powershell。或者使用完整路径查看发生了什么。 - manojlds
@Erman 我认为你想要将 powershell.exe my.bat -NoNewWindow 放进去。 - Lucas B
当我在start-process中添加了-NoNewWindow参数时,我遇到了与Erman评论1中相同的错误,但是当我完全限定可执行文件时,它为我解决了这个错误,所以start-process 'full path to\your.exe' -NoNewWindow,命令按预期运行。 - Dan
1
对于我的情况,-Verb RunAs 参数集导致了一个 AmbiguousParameterSet 错误。 - jrbe228

9

楼主对回答似乎很满意,但是在执行程序后它并没有保持新窗口打开,这好像是他想要的(也是我正在寻找的答案)。因此,经过更多的研究,我得出了以下结论:

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

2
对于 PowerShell 纯粹主义者的另一种选择是使用 PowerShell 代替 cmd:Start-Process powershell "your.exe ; read-host '按 Enter 键继续'" - Cary
2
我使用以下命令:Start-Process "powershell" -wait -ArgumentList "tree 'D:' ; pause" - larkee

4

几周前,我解决了类似的问题。如果你不想使用 & (& '.\program.exe'),那么你可以使用 start-process 并通过 start-process 读取输出(在那里你显式地读取输出)。

将此作为单独的 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"

您还可以轻松地重定向输出或者在应用程序可能冻结的情况下实施某种类型的超时处理...


这是一个有趣的方法,它可以工作,但是由外部进程创建的输出会无序返回。此外,脚本似乎在继续之前不等待进程结束,因为我看到它的输出与外部命令的输出交错。 - STLDev

3
如果程序是批处理文件(.cmd或.bat扩展名),通过使用“cmd /c foo.cmd”命令启动,只需将其更改为“cmd /k foo.cmd”,程序就会执行,但提示符仍然保持打开状态。
如果程序不是批处理文件,请将其包装在批处理文件中,并在其末尾添加“pause”命令。要将程序包装在批处理文件中,只需将命令放置在文本文件中,并将其命名为.cmd扩展名。然后执行该文件而不是exe文件。

0
pwsh -noe -c "echo 1"

0
只需再添加一个选项到列表中。您可以在末尾添加"&& PAUSE",这样如果第一个命令成功运行,它就会执行这个选项。
例如,Start-Process cmd "/c `"reg.exe query hkcu\printers\connections && pause`""

0
使用Start-Process和在$arguments脚本块中,您可以放置一个Read-Host。
$arguments = {
    "Get-process"
    "Hello"
    Read-Host "Wait for a key to be pressed"
  }
Start-Process powershell -Verb runAs -ArgumentList $arguments

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接