ss64 comparing comparadores commands syntax powershell

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. :)