sintaxis scripts script running ise how from ejemplos disabled cannot because batch syntax powershell command-execution

syntax - scripts - script powershell ejemplos



EjecuciĆ³n condicional(&& y ||) en powershell (5)

Ya hay una pregunta que trata mi problema ( ¿Puedo hacer que && trabaje en Powershell? ), Pero con una diferencia. Necesito una SALIDA de ambos comandos. Mira, si acabo de correr:

(command1 -arg1 -arg2) -and (command2 -arg1)

No veré ninguna salida, sino mensajes stderr. Y, como era de esperar, simplemente escribiendo:

command1 -arg1 -arg2 -and command2 -arg1

Da error de sintaxis.


La solución más sencilla es utilizar.

powershell command1 && powershell command2

en un shell cmd. Por supuesto, no puede usar esto en un script .ps1, por lo que hay esa limitación.


Para simplificar los scripts de varios pasos donde doThis || La salida 1 sería realmente útil, uso algo como:

function ProceedOrExit { if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 } } doThis; ProceedOrExit doNext # or for long doos doThis ProceedOrExit doNext


Prueba esto:

$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)

El $ () es una subexpresión que le permite especificar varias declaraciones dentro de incluir una canalización. Luego ejecute el comando y canalice a Out-Host para que pueda verlo. Luego, en la siguiente declaración (la salida real de la subexpresión) la salida $? Es decir, el resultado del éxito del último comando.

Por cierto el $? funciona bien para comandos nativos (ej. consola) pero para cmdlets deja algo que desear. Es decir, $? solo parece devolver $ false cuando un cmdlet encuentra un error de terminación. Parece que $? necesita al menos tres estados (fallido, exitoso y parcialmente exitoso). Entonces, si estás usando cmdlets, esto funciona mejor:

$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and $(command -arg1 -ev err | Out-Host;!$err)

Este tipo de golpes todavía. Quizás algo como esto sería mejor:

function ExecuteUntilError([scriptblock[]]$Scriptblock) { foreach ($sb in $scriptblock) { $prevErr = $error[0] . $sb if ($error[0] -ne $prevErr) { break } } } ExecuteUntilError {command -arg1 -arg2},{command2-arg1}


Un poco más largo se ve abajo.

prueba {nombre de host; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} captura {echo err} finalmente {}


  • Bash''s / cmd ''s && y || los operadores de control NO tienen equivalentes de PowerShell , y como no puede definir operadores personalizados en PowerShell, no hay soluciones adecuadas .

    • El | Out-Host | Out-Host solución alternativa de Keith Hill basada en | Out-Host está muy limitada, ya que solo puede enviar la salida de comando normal a la consola (terminal), lo que evita que la salida se envíe a través de la tubería o se capture en una variable o archivo.

Encuentra información de antecedentes en esta respuesta mía.