2012-02-11 22 views
11

Cuando ejecuto un programa en PowerShell, abre una nueva ventana y antes de que pueda ver el resultado, la ventana se cierra. ¿Cómo lo hago para que PowerShell mantenga esta ventana abierta?¿Cómo obtener PowerShell para mantener abierta una ventana de comando?

+0

¿este programa es un archivo ejecutable o un archivo por lotes? ¿Puedes dar el comando exacto que estás ejecutando, quizás cambiando el nombre del ejecutable? –

+0

Es un exe. Agregué la carpeta en la que se encuentra el programa y cuando escribo el nombre del programa se ejecuta, excepto que la ventana que abre se cierra demasiado rápido para que yo pueda leer lo que dice. El programa es un programa para probar programas de Python. En cuanto a su comentario a continuación, no sé cómo ajustar un programa en un archivo por lotes:/ – Erman

+0

Actualicé mi respuesta para aclarar cómo hacerlo. También podría tener sentido redirigir la salida de tus programas a un archivo de texto. –

Respuesta

1

Si el programa es un archivo por lotes (extensión .cmd o .bat) que se inicia con el comando cmd /c foo.cmd, simplemente cámbielo a cmd /k foo.cmd y el programa se ejecuta, pero el mensaje permanece abierto.

Si el programa no es un archivo por lotes, envuélvalo en un archivo por lotes y agregue el comando pause al final de este. Para envolver el programa en un archivo por lotes, simplemente coloque el comando en un archivo de texto y asígnele la extensión .cmd. Luego ejecuta eso en lugar del exe.

8

trate de hacer:

start-process your.exe -NoNewWindow 

Añadir un -Wait también si es necesario.

+0

Cuando hago esto, me dice "Start-Process: This el comando no se puede ejecutar debido al error: el sistema no puede encontrar el archivo especificado. " Lo que es extraño porque agregué la ubicación del exe a mi ruta. – Erman

+0

@Erman - Asegúrate de que realmente lo sea. Reinicie Powershell si es necesario. O usa la ruta completa para ver qué está pasando. – manojlds

+0

@Erman Creo que quiere poner powershell.exe my.bat -NoNewWindow –

3

Estaba resolviendo un problema similar hace unas semanas. Si no desea utilizar & (& '.\program.exe'), puede utilizar el proceso de inicio y leer la salida por el proceso de inicio (donde lee la salida de forma explícita).

sólo hay que poner este archivo PS1 como separado - por ejemplo (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() 

Y luego llamar así:

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

También puede redirigir fácilmente de salida o aplicar algún tipo de tiempo de espera en caso de que su aplicación se congele ...

+0

Perfecto. Exactamente lo que estaba buscando. Gracias una tonelada. – Saulius

4

OP parecía satisfecha con la respuesta, pero no mantiene abierta la nueva ventana después de ejecutar el programa, que es lo que parecía ser preguntando (y la respuesta que estaba buscando). Entonces, después de algunas investigaciones más, se me ocurrió:

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

Una alternativa para los puristas de PowerShell sería usar powershell en lugar de cmd: Start-Process powershell "your.exe ; read-host 'Presione Enter para continuar' " – Cary

+1

Utilizo esto:' Start-Process "powershell" -wait -ArgumentList "tree 'D:'; pausa "'. – larkee

Cuestiones relacionadas