Erman
Erman

Reputation: 261

How to get PowerShell to keep a command window open?

When I run a program on PowerShell it opens a new window and before I can see the output, the window closes. How do I make it so PowerShell keeps this window open?

Upvotes: 24

Views: 48040

Answers (7)

Goggeh
Goggeh

Reputation: 1

Just one more option to add the the list. You can add a "&& PAUSE" to the end so it runs this if the first command is successful.

e.g., Start-Process cmd "/c `"reg.exe query hkcu\printers\connections && pause`""

Upvotes: 0

mdimai666
mdimai666

Reputation: 787

pwsh -noe -c "echo 1"

Upvotes: 0

bupmm
bupmm

Reputation: 71

With Startprocess and in the $arguments scriptblock, you can put a Read-Host

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

Upvotes: 0

Tomas Panik
Tomas Panik

Reputation: 4609

I was solving a similar problem few weeks ago. If you don't want to use & (& '.\program.exe') then you can use start process and read the output by start process (where you read the output explicitly).

Just put this as separate PS1 file - for example (or to macro):

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()

And then call it like:

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

You can also easily redirect output or implement some kind of timeout in case your application can freeze...

Upvotes: 4

Cary
Cary

Reputation: 393

The OP seemed satisfied with the answer, but it doesn't keep the new window open after executing the program, which is what he seemed to be asking (and the answer I was looking for). So, after some more research, I came up with:

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

Upvotes: 11

Justin Dearing
Justin Dearing

Reputation: 14928

If the program is a batch file (.cmd or .bat extension) being launched with cmd /c foo.cmd command, simply change it to cmd /k foo.cmd and the program executes, but the prompt stays open.

If the program is not a batch file, wrap it in a batch file and add the pause command at the end of it. To wrap the program in a batch file, simply place the command in a text file and give it the .cmd extension. Then execute that instead of the exe.

Upvotes: 3

manojlds
manojlds

Reputation: 301037

Try doing:

start-process your.exe -NoNewWindow

Add a -Wait too if needed.

Upvotes: 17

Related Questions