当我在PowerShell上运行一个程序时,它会打开一个新窗口,在我看到输出之前,窗口关闭了。如何使PowerShell保持此窗口打开?
xkrw2x1b1#
尝试做:
start-process your.exe -NoNewWindow
如果需要,也可以添加-Wait。
-Wait
1tuwyuhd2#
OP似乎对这个答案很满意,但在执行程序后,它并没有保持新窗口打开,这似乎是他所问的(也是我所寻找的答案)。所以,经过更多的研究,我得出了:
Start-Process cmd "/c `"your.exe & pause `""
nwsw7zdq3#
几周前我也遇到过类似的问题。如果你不想使用&(& '.\program.exe'),那么你可以使用start process并通过start process读取输出(在这里你显式地读取输出)。只是把这个作为单独的PS1文件-例如(或宏):
& '.\program.exe'
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 EventRegister-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 EventRegister-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()
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 }
$process.Start() | Out-Null
$process.BeginOutputReadLine()
$process.BeginErrorReadLine()
$process.WaitForExit()
然后这样称呼它:
.\startprocess.ps1 "c:\program.exe" "params"
您还可以轻松地重定向输出或实现某种类型的超时,以防您的应用程序冻结。
v9tzhpje4#
如果程序是一个批处理文件(.cmd或.bat扩展名),使用cmd /c foo.cmd命令启动,只需将其更改为cmd /k foo.cmd,程序就会执行,但提示符保持打开状态。如果程序不是批处理文件,将其 Package 在批处理文件中,并在其末尾添加pause命令。要将程序 Package 在批处理文件中,只需将命令放在文本文件中,并给予.cmd扩展名。然后执行它而不是exe。
cmd /c foo.cmd
cmd /k foo.cmd
pause
sd2nnvve5#
使用Startprocess并在$arguments脚本块中,可以将Read-Host
$arguments = { "Get-process" "Hello" Read-Host "Wait for a key to be pressed" }Start-Process powershell -Verb runAs -ArgumentList $arguments
$arguments = {
"Get-process"
"Hello"
Read-Host "Wait for a key to be pressed"
}
Start-Process powershell -Verb runAs -ArgumentList $arguments
sqserrrh6#
pwsh -noe -c "echo 1"
n3schb8v7#
还有一个选项可以添加列表。您可以在末尾添加“&& PAUSE”,以便在第一个命令成功时运行此命令。例如,Start-Process cmd“/c “reg.exe query hkcu\printers\connections && pause””
“reg.exe query hkcu\printers\connections && pause
7条答案
按热度按时间xkrw2x1b1#
尝试做:
如果需要,也可以添加
-Wait
。1tuwyuhd2#
OP似乎对这个答案很满意,但在执行程序后,它并没有保持新窗口打开,这似乎是他所问的(也是我所寻找的答案)。所以,经过更多的研究,我得出了:
nwsw7zdq3#
几周前我也遇到过类似的问题。如果你不想使用&(
& '.\program.exe'
),那么你可以使用start process并通过start process读取输出(在这里你显式地读取输出)。只是把这个作为单独的PS1文件-例如(或宏):
然后这样称呼它:
您还可以轻松地重定向输出或实现某种类型的超时,以防您的应用程序冻结。
v9tzhpje4#
如果程序是一个批处理文件(.cmd或.bat扩展名),使用
cmd /c foo.cmd
命令启动,只需将其更改为cmd /k foo.cmd
,程序就会执行,但提示符保持打开状态。如果程序不是批处理文件,将其 Package 在批处理文件中,并在其末尾添加
pause
命令。要将程序 Package 在批处理文件中,只需将命令放在文本文件中,并给予.cmd扩展名。然后执行它而不是exe。sd2nnvve5#
使用Startprocess并在$arguments脚本块中,可以将Read-Host
sqserrrh6#
n3schb8v7#
还有一个选项可以添加列表。您可以在末尾添加“&& PAUSE”,以便在第一个命令成功时运行此命令。
例如,Start-Process cmd“/c
“reg.exe query hkcu\printers\connections && pause
””