&&
es notoriamente difícil de buscar en google, pero lo mejor que he encontrado es este artículo que dice usar -and
.
Desafortunadamente no da más información, y no puedo averiguar con qué debo hacer -and
(una vez más, algo muy difícil de buscar)
El contexto en el que intento usarlo es "ejecutar cmd1, y si tiene éxito, ejecutar cmd2", básicamente esto:
csc /t:exe /out:a.exe SomeFile.cs && a.exe
Esto debería ser un simple punto de repetición para alguien que lo sabe, ¡gracias!
Editar: si solo desea ejecutar varios comandos en una sola línea y no le importa si el primero falla o no, puede usar ;
Para la mayoría de mis propósitos, está bien
Por ejemplo: kill -n myapp; ./myapp.exe
.
syntax
powershell
Orion Edwards
fuente
fuente
&&
y||
forme parte de PowerShell: vote por la función aquí .!sym
.&&
y||
! Pesar en el GitHub PRRespuestas:
En CMD, '&&' significa "ejecutar el comando 1, y si tiene éxito, ejecutar el comando 2". Lo he usado para cosas como:
En PowerShell, lo más cercano que puede hacer es:
Tiene la misma lógica, pero el texto de salida de los comandos se pierde. Sin embargo, tal vez sea lo suficientemente bueno para ti.
Si está haciendo esto en un script, probablemente sea mejor separar las declaraciones, como esta:
27/11 2019 : el
&&
operador ya está disponible para PowerShell 7 Preview 5+ :fuente
build ; if ($?) { run_tests }
en la línea de comando también.bash
ideas en PowerShell. Es la funcionalidad básica del shell. Hasta ahora, lo mejor que he visto es elbuild ; if ($?) { run_tests }
que usaré de ahora en adelante. ¡Espero que el equipo de PowerShell agregue&&
soporte!&& y || estaban en la lista de cosas para implementar (todavía están) pero no aparecieron como la siguiente cosa más útil para agregar. La razón es que tenemos -AND y -OR. Si cree que es importante, presente una sugerencia en Connect y la consideraremos para V3.
fuente
-AND
-and
come la salida, no es equivalente en absoluto.Prueba esto:
fuente
$ErrorActionPreference
solo gobierna cómo se tratan los errores no terminados informados por los cmdlets ; utilidades externas comocsc
ya.exe
nunca informan tales errores (solo reflejan su estado de salida en$?
(indicador de éxito) y$LASTEXITCODE
(el código de salida específico informado)), por lo que su línea de comando equivale a la ejecución incondicional de ambos comandos (el equivalente decmd
'scsc /t:exe /out:a.exe SomeFile.cs & a.exe
)Si su comando está disponible en cmd.exe (algo así como
python ./script.py
no un comando de PowerShell comoii .
(Esto significa abrir el directorio actual mediante el explorador)), puede ejecutar cmd.exe dentro de PowerShell. La sintaxis es así:Aquí,
&&
se proporciona la sintaxis cmd descrita en esta pregunta .fuente
Probé esta secuencia de comandos en PowerShell:
Prueba de Fisrt
($MyVar -ne $null)
devuelto verdadero y(Get-Content $MyVar)
también devuelto verdadero .Segunda prueba
($MyVar -ne $null)
devuelto falso y hasta ahora debo asumir que(Get-Content $MyVar)
también devuelto falso .La tercera prueba demostró que la segunda condición ni siquiera fue analizada.
($MyVar -ne $null)
devolvió falso y demostró que la segunda condición(Get-Content "C:\MyTxt.txt")
nunca se ejecutó, al devolver falso en todo el comando.fuente
Pregunta muy antigua, pero para los recién llegados: tal vez la versión de PowerShell (similar pero no equivalente ) que está buscando la pregunta, se use de la
-and
siguiente manera:(build_command) -and (run_tests_command)
fuente
&&
, ya que ignora el código de salida debuild_command
.;
es el equivalente a&
en cmd y;
en bash. Definitivamente no es lo mismo que&&
en cmdDepende del contexto, pero aquí hay un ejemplo de "-y" en acción:
Así que se obtienen todos los archivos de más de 10 kb en un directorio cuyo nombre de archivo comienza con "f".
fuente
Es un poco más largo que "&&" pero logra lo mismo sin secuencias de comandos y no es demasiado difícil de recordar. Mejor tarde que nunca. :)
fuente
Start-Process
es la herramienta incorrecta para invocar utilidades de línea de comandos en general. Específicamente, como se usa aquí, seStart-Process
ejecuta defilename1.exe
forma asíncrona en una nueva ventana de consola y no devuelve nada , lo que en un contexto booleano evalúa$false
. Incluso si omitióStart-Process
(que es cómo debería invocar directamente a las utilidades de línea de comandos), el enfoque se quedaría corto, porque el resultado del condicional depende de si la utilidad produjo algún resultado estándar, que no tiene una relación garantizada con si exitoso o no.Creo que una simple declaración if puede lograr esto. Una vez que vi la respuesta de mkelement0 arriba de que el último estado de salida se almacena en $ ?, puse lo siguiente junto:
Entonces, para el ejemplo de la operación, sería:
fuente
Un equivalente detallado es combinar
$LASTEXITCODE
y-eq 0
:No estoy seguro de por qué
if ($?)
no funcionó para mí, pero este sí.fuente
Podemos probar este comando en lugar de usar el método &&
intente {hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findtr / i bios}} catch {echo err} finalmente {}
fuente
try
/catch
, porque solo es necesario para terminar errores, que utilidades externas comohostname
,ipconfig
yfindstr
no pueden desencadenar. La verificación$LASTEXITCODE
solo es necesaria si desea conocer el código de salida específico establecido por una utilidad externa: el éxito o el fracaso abstractos se reflejan$?
, al igual que con los cmdlets nativos.&&
en Unix se parece mucho a try / catch, ya que no requiere que envuelva los comandos posteriores en un nuevo bloque (es decir}
) cuando cortocircuita los comandos posteriores (los omite). Creo que unaAmpAmp
función / filtro que arroje cuándoif (!?) { throw "last command failed" }
sería un reemplazo muy útil para portar&&
a PowerShell. uso :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe