2012-06-12 17 views
6

Estoy trabajando en un script de instalación Mssql y quiero obtener los resultados de una instalación mssql silenciosa. En mi secuencia de comandos de PowerShell, ejecuto este comando:Devolviendo un código de error de CMD a Powershell

$result = (start cmd "/c D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini && exit 0 || exit 1") 

que debería devolver 0 en el error y 1 en el pase. Lamentablemente, no obtengo ningún resultado. ¿Algunas ideas?

+0

Esto no es como '' && obras, y no se puede elegir la salida '' 0' o salida después de la 1' la instalación se ejecuta. Tienes que probar 'ERRORLEVEL', y eso generalmente se hace en un archivo por lotes, que luego podría salir con el código de error apropiado. –

+0

Bueno, realmente funciona así. '&&' ejecuta el lado izquierdo y si es falso (el comando falló), entonces se ejecuta en el lado derecho de '&&'. Grupos de precedencia del operador '(Izquierda && Medio) || Derecha'. Ahora que lo pienso, si '||' es un condicional o solo se ejecuta hasta un valor verdadero, entonces debería haber usado '&' en lugar de '||'. –

Respuesta

2

Esta es la forma de hacerlo: start es en realidad un alias Start-Process, por lo que hay que mirar es documentación, que es muy diferente a cmd.exe de start. Para que pueda hacer esto:

(Start-Process -FilePath "cmd.exe /c ..." -Wait -Passthru).ExitCode 

¡Así de fácil!

+0

Tenga en cuenta que, simplemente, lo escribirá en la tubería. Si desea hacer eco en StdOut, debería usar el cmdlet Write-Host. –

+0

Esto fue un falso positivo. Resulta que esto solo funciona si eliminas la parte 'start cmd '/ c'. Me funcionó porque yo había estado probando ambos en mi sesión de PowerShell. La solicitud de comando todavía no devuelve nada. –

8

Una alternativa a Start-Process es el operador de llamada más sintácticamente concisa &.

& cmd.exe /c 'ping.exe doesnotexist && exit 0 || exit 1' 

El código de salida estará contenida en la variable incorporada $LASTEXITCODE manera:

Write-Host $LASTEXITCODE 

Este contendrá el código de salida de la ejecución del programa por lo que no es necesario tener que correr con CMD.exe usted podría hacer:

& ping.exe doesnotexist ; Write-Host $LASTEXITCODE 

aplicado a su programa de línea de comandos:

& cmd.exe /c 'D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini && exit 0 || exit 1' 

O simplemente:

& D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini 

En ambos casos $LASTEXITCODE debe ser 0 para el éxito, no cero en caso contrario (si el programa externo fue escrito correctamente).

+0

Sí, yo Vi que también podías hacer eso. Quería que el mío estuviera en una nueva ventana, así que necesitaba 'Start-Process' –

0

Demasiado tarde quizás, pero ¿esto ayuda?

start /WAIT cmd.exe /C "YOUR-COMMAND-HERE" & if errorlevel 1 echo 'error occurred' 

También puede volver explícitamente un código de error como este:

start /WAIT cmd.exe /C "YOUR-COMMAND-HERE & exit MY-ERROR-CODE" & if errorlevel 1 echo 'error occurred' 
Cuestiones relacionadas