Come posso annullare una condizione in PowerShell?


274

Come posso annullare un test condizionale in PowerShell?

Ad esempio, se voglio verificare la directory C: \ Code, posso eseguire:

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

Esiste un modo per negare tale condizione, ad esempio (non funzionante):

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

Soluzione alternativa :

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

Funziona bene, ma preferirei qualcosa in linea.

Risposte:


508

Ci hai quasi fatto Not. Dovrebbe essere:

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

Puoi anche usare !:if (!(Test-Path C:\Code)){}

Solo per divertimento, potresti anche usare l'esclusiva bit per bit o, sebbene non sia il metodo più leggibile / comprensibile.

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}

2
Interessante, quindi -notarriva la tradizionale alternativa di !allora? Posso in qualche modo ottenere le alternative tradizionali -eqe -netroppo?
Roman Starkov,

8
No, -notè l'unico operatore logico fornito con un'alternativa (vedi help about_Logical_Operators) e gli operatori non possono essere aliasati.
Rynant,

14
Grazie, mi mancava il fatto che l'uso delle !parentesi richieste.
Sviluppatore olistico,

@ Holistic-Developer !stesso non richiede parentesi. Almeno non in PS3.
Llyle,

9
Il termine "! Test-Path" non è riconosciuto come il nome di un cmdlet ... :)
sodawillow

9

Se sei come me e non ti piace la doppia parentesi, puoi usare una funzione

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

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

Esempio


1
Mi piace questo, ma probabilmente non posso usare questa notimplementazione ovunque (per esempio not Test-Path -path C:\Codenon funzionerà). Vedi anche questo post correlato .
orad,

2
Perl ha un linguaggio più logico, nel senso vulcaniano, chiamato Unless, che è scritto come una funzione. Essendo mezzo vulcaniano, lo preferisco e l'ho implementato sia in C #, come funzione, sia in C e C ++, come macro.
David A. Gray,

1
@ DavidA.Gray Ruby ha unlesscome parola chiave (proprio come if) ma la maggior parte degli utenti di altre lingue lo odiano.
Franklin Yu,

3

Powershell accetta anche l'operatore C / C ++ / C * non

if (! (Test-Path C: \ Code)) {scrivi "non esiste!" }

Lo uso spesso perché sono abituato a C * ...
consente la compressione / semplificazione del codice ...
Lo trovo anche più elegante ...


0

se non ti piacciono le doppie parentesi o non vuoi scrivere una funzione, puoi semplicemente usare una variabile.

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.