Devolver un código de error de CMD a Powershell
Frecuentes
Visto 20,169 veces
6
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?
3 Respuestas
10
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
2
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
0
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 powershell cmd or haz tu propia pregunta.
Asi no es como
&&
funciona, y no puedes elegirexit 0
orexit 1
después de que se ejecute la instalación. tienes que probarERRORLEVEL
, y eso generalmente se hace en un archivo por lotes, que luego podría salir con el código de error apropiado. - Ken WhiteBueno, 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||
. - Caleb Jares