¿Cómo niego una condición en PowerShell?

274

¿Cómo niego una prueba condicional en PowerShell?

Por ejemplo, si quiero verificar el directorio C: \ Code, puedo ejecutar:

if (Test-Path C:\Code){
  write "it exists!"
}

¿Hay alguna manera de negar esa condición, por ejemplo (no funciona):

if (Not (Test-Path C:\Code)){
  write "it doesn't exist!"
}

Solución alternativa :

if (Test-Path C:\Code){
}
else {
  write "it doesn't exist"
}

Esto funciona bien, pero preferiría algo en línea.

Ben McCormack
fuente

Respuestas:

508

Casi lo tienes con Not. Debería ser:

if (-Not (Test-Path C:\Code)) {
    write "it doesn't exist!"
} 

También puedes usar !:if (!(Test-Path C:\Code)){}

Solo por diversión, también puedes usar bitwise exclusive o, aunque no es el método más legible / comprensible.

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}
Rynant
fuente
2
Interesante, ¿entonces -notviene con la alternativa tradicional de !entonces? ¿De alguna manera puedo obtener las alternativas tradicionales -eqy -netambién?
Roman Starkov
8
No, -notes el único operador lógico que viene con una alternativa (ver help about_Logical_Operators), y los operadores no pueden tener alias.
Rynant
14
Gracias, me faltaba el hecho de que el uso de !paréntesis requeridos.
Desarrollador holístico
@ Holistic-Developer en !sí mismo no requiere paréntesis. Al menos no en PS3.
Llyle
9
El término '! Test-Path' no se reconoce como el nombre de un cmdlet ... :)
sodawillow
9

Si eres como yo y no te gusta el paréntesis doble, puedes usar una función

function not ($cm, $pm) {
  if (& $cm $pm) {0} else {1}
}

if (not Test-Path C:\Code) {'it does not exist!'}

Ejemplo

Steven Penny
fuente
1
Me gusta esto, pero probablemente no pueda usar esta notimplementación en todas partes (por ejemplo not Test-Path -path C:\Code, no funcionará). Vea también esta publicación relacionada .
orad
2
Perl tiene un lenguaje más lógico, en el sentido vulcano, llamado Unless, que se escribe como una función. Siendo medio vulcano, lo prefiero, y lo he implementado tanto en C #, como una función, como en C y C ++, como una macro.
David A. Gray
1
@ DavidA.Gray Ruby tiene unlesscomo palabra clave (igual que if) pero la mayoría de los usuarios de otros idiomas lo odian.
Franklin Yu
3

Powershell también acepta el operador no C / C ++ / C *

if (! (Test-Path C: \ Code)) {escriba "¡no existe!" }

Lo uso a menudo porque estoy acostumbrado a C * ...
permite la compresión / simplificación de código ...
También me parece más elegante ...

ZEE
fuente
0

Si no le gustan los corchetes dobles o no desea escribir una función, puede usar una variable.

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Melchior Kannengießer
fuente