syntax - comparing - powershell ss64
¿Puedo obtener && para trabajar en Powershell? (9)
Intenté esta secuencia de comandos en PowerShell:
Prueba Fisrt
PS C:/> $MyVar = "C:/MyTxt.txt"
PS C:/> ($MyVar -ne $null) -and (Get-Content $MyVar)
True
($MyVar -ne $null)
devuelto verdadero y (Get-Content $MyVar)
también devuelto verdadero .
Segunda prueba
PS C:/> $MyVar = $null
PS C:/> ($MyVar -ne $null) -and (Get-Content $MyVar)
False
($MyVar -ne $null)
devolvió false y hasta ahora debo asumir que (Get-Content $MyVar)
también devolvió false .
La tercera prueba demostró que la segunda condición ni siquiera se analizó.
PS C:/> ($MyVar -ne $null) -and (Get-Content "C:/MyTxt.txt")
False
($MyVar -ne $null)
devolvió falso y demostró que la segunda condición (Get-Content "C:/MyTxt.txt")
nunca se ejecutó, al devolver false en todo el comando.
&&
es notoriamente difícil de buscar en google, pero lo mejor que he encontrado es este artículo que dice usar -and
.
Lamentablemente, no proporciona más información, y no puedo averiguar qué se supone que debo hacer con, -and
(una vez más, algo muy difícil de buscar).
El contexto en el que trato de 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 fácil, algunos puntos de representante para alguien que sabe, ¡gracias!
Editar: si solo quiere ejecutar múltiples comandos en una sola línea y no le importa si la primera falla o no, puede usar ;
Para la mayoría de mis propósitos, esto está bien
Por ejemplo: kill -n myapp; ./myapp.exe
kill -n myapp; ./myapp.exe
.
&& y || estaban en la lista de cosas para implementar (todavía lo están) pero no surgieron como la siguiente cosa más útil para agregar. La razón es que tenemos -AND y -OR. Si crees que es importante, presenta una sugerencia sobre Connect y la consideraremos para V3.
Creo que una declaración simple de if puede lograr esto. Una vez que vi la respuesta de mkelement0 anterior que el estado de la última salida se almacena en $ ?, pongo lo siguiente:
# Set 1st command to variable
$a=somecommand
# Temp var to store exit status of last command (since we can''t write to $?)
$test=$?
# Run Test
if ($test=$true) { 2nd-command }
Entonces, para el ejemplo de la operación, sería:
a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }
Depende del contexto, pero aquí hay un ejemplo de "-y" en acción:
get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }
Así que eso significa que todos los archivos son más grandes que 10kb en un directorio cuyo nombre de archivo comienza con "f".
En CMD, ''&&'' significa "ejecutar el comando 1, y si tiene éxito, ejecutar el comando 2". Lo he usado para cosas como:
build && run_tests
En PowerShell, lo más cercano que puede hacer es:
(build) -and (run_tests)
Tiene la misma lógica, pero el texto de salida de los comandos se pierde. Aunque tal vez sea lo suficientemente bueno para ti.
EDITAR
Si estás haciendo esto en un script, probablemente será mejor separar las declaraciones, así:
build
if ($?) {
run_tests
}
Normalmente, en Linux haría algo como: ruby -c learn.rb && foodcritic learn.rb
Sin embargo, en Windows PS, ¡no puedo hacerlo! Así que terminé haciendo un archivo .ps1
con esto:
Param(
[string]$fileName
)
ruby -c $fileName
foodcritic $fileName
y lo llamó bamemeril.ps1
PS C:/Users/riotc> ./bamemeril.ps1 learn.rb
Syntax OK
Checking 1 files
x
FC011: Missing README in markdown format: ../README.md:1
FC031: Cookbook without metadata.rb file: ../metadata.rb:1
FC071: Missing LICENSE file: ../LICENSE:1
PS C:/Users/riotc>
Podemos probar este comando en lugar de usar el método &&
try {hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} catch {echo err} finally {}
Prueba esto:
$errorActionPreference=''Stop''; csc /t:exe /out:a.exe SomeFile.cs; a.exe
if (start-process filename1.exe) {} else {start-process filename2.exe}
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. :)