2012-02-11 26 views
11

Quando eseguo un programma su PowerShell apre una nuova finestra e prima che possa vedere l'output, la finestra si chiude. Come posso fare in modo che PowerShell mantenga questa finestra aperta?Come ottenere PowerShell per mantenere aperta una finestra di comando?

+0

questo programma è un file exe o batch? Puoi dare il comando esatto che stai eseguendo, magari cambiando il nome dell'eseguibile? –

+0

È un exe. Ho aggiunto la cartella che il programma è nel mio percorso e quando digito il nome del programma che esegue, ad eccezione della finestra in cui si apre si chiude troppo velocemente per me per leggere ciò che dice. Il programma è un programma per testare i programmi python. Per quanto riguarda il tuo commento qui sotto, non so come avvolgere un programma in un file batch:/ – Erman

+0

Ho aggiornato la mia risposta per chiarire come farlo. Potrebbe anche avere senso reindirizzare l'output dei programmi su un file di testo. –

risposta

1

Se il programma è un file batch (estensione .cmd o .bat) avviato con il comando cmd /c foo.cmd, è sufficiente modificarlo in cmd /k foo.cmd e il programma viene eseguito, ma il prompt rimane aperto.

Se il programma non è un file batch, inserirlo in un file batch e aggiungere il comando pause al termine. Per avvolgere il programma in un file batch, è sufficiente posizionare il comando in un file di testo e assegnargli l'estensione .cmd. Quindi esegui quello invece dell'exe.

8

provare a fare:

start-process your.exe -NoNewWindow 

Aggiungi un -Wait troppo, se necessario.

+0

Quando faccio questo mi dice "Start-Process: This il comando non può essere eseguito a causa dell'errore: il sistema non riesce a trovare il file specificato. " Che strano perché ho aggiunto la posizione dell'exe al mio percorso. – Erman

+0

@Erman: assicurati che lo sia davvero. Riavvia PowerShell se necessario. Oppure usa il percorso completo per vedere cosa sta succedendo. – manojlds

+0

@Erman Penso che vuoi mettere powershell.exe my.bat -NoNewWindow –

3

Stavo risolvendo un problema simile qualche settimana fa. Se non si desidera utilizzare & (& '.\program.exe'), è possibile utilizzare il processo di avvio e leggere l'output dal processo di avvio (in cui si legge l'output in modo esplicito).

Basta mettere questo file PS1 come separati - per esempio (o 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() 

E poi lo chiamano piace:

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

Si può anche facilmente reindirizzare uscita o implementare qualche tipo di timeout nel caso in cui l'applicazione possa congelare ...

+0

Perfetto. Esattamente quello che stavo cercando. Grazie mille. – Saulius

4

L'OP sembrava soddisfatto della risposta, ma non mantiene aperta la nuova finestra dopo l'esecuzione del programma, che è ciò che sembrava essere chiedendo (e la risposta che stavo cercando). Quindi, dopo un po 'di ricerche, ho trovato:

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

Un'alternativa per i puristi di PowerShell sarebbe utilizzare PowerShell al posto di cmd: Start-Process PowerShell "il tuo.exe ; read-host 'Premere Invio per continuare' " – Cary

+1

Io uso questo:' Start-Process "powershell" -wait -ArgumentList "albero 'D:'; mettere in pausa "'. – larkee

Problemi correlati