Devolver un código de error de CMD a Powershell

Estoy trabajando en un script de instalación de Mssql y quiero obtener los resultados de una instalación silenciosa de mssql. En mi script de PowerShell, ejecuto este comando:

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

Que debería devolver 0 si falla y 1 si pasa. Desafortunadamente, no obtengo ningún resultado. ¿Algunas ideas?

preguntado el 12 de junio de 12 a las 21:06

Asi no es como && funciona, y no puedes elegir exit 0 or exit 1 después de que se ejecute la instalación. 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. -

Bueno, en realidad funciona así. && ejecuta el lado izquierdo y si es falso (el comando falló), entonces ejecuta el lado derecho del &&. Grupos de precedencia de operadores (Left && Middle) || Right. Ahora que lo pienso, si || es un condicional-o y solo se ejecuta hasta un valor verdadero, entonces debería haber usado & en lugar de ||. -

3 Respuestas

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

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

El código de salida estará contenido en la variable incorporada $LASTEXITCODE Sun:

Write-Host $LASTEXITCODE

Esto contendrá el código de salida de la ejecución del programa, por lo que no es necesario que lo ejecute con CMD.exe, simplemente 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 solo:

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

En ambos casos $LASTEXITCODE debe ser 0 para el éxito, distinto de cero de lo contrario (si el programa externo se escribió correctamente).

Respondido el 13 de junio de 12 a las 00:06

Sí, vi que también podías hacer eso. Sin embargo, quería que la mía estuviera en una nueva ventana. entonces necesitaba Start-Process - Caleb Jares

Así es como lo haces: start en realidad es un alias Start-Process, así que hay que mirar es documentación, que es muy diferente a la de cmd.exe start. Entonces puedes hacer esto:

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

¡Tan fácil!

Respondido el 12 de junio de 12 a las 23:06

Tenga en cuenta que eso simplemente lo escribirá en la canalización. Si desea repetirlo en StdOut, usaría el cmdlet Write-Host. - usuario189198

Este fue un falso positivo. Resulta que esto solo funciona si quitas el start cmd "/c parte. Funcionó para mí porque había estado probando ambos en mi sesión de PowerShell. El símbolo del sistema todavía no devuelve nada ... - Caleb Jares

Demasiado tarde tal vez, pero ¿esto ayuda?

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

también puede devolver 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'

Respondido el 26 de junio de 14 a las 04:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.