Wie negiere ich eine Bedingung in PowerShell?

272

Wie negiere ich einen bedingten Test in PowerShell?

Wenn ich beispielsweise nach dem Verzeichnis C: \ Code suchen möchte, kann ich Folgendes ausführen:

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

Gibt es eine Möglichkeit, diesen Zustand zu negieren, z. B. (nicht arbeitend):

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

Problemumgehung :

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

Das funktioniert gut, aber ich würde etwas Inline bevorzugen.

Ben McCormack
quelle

Antworten:

508

Du hattest es fast mit Not. Es sollte sein:

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

Sie können auch verwenden !:if (!(Test-Path C:\Code)){}

Nur zum Spaß können Sie auch bitweise exklusiv oder verwenden, obwohl dies nicht die am besten lesbare / verständlichste Methode ist.

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}
Rynant
quelle
2
Interessant, also -notkommt mit der traditionellen Alternative von !dann? Kann ich irgendwie die traditionellen Alternativen für -eqund -neauch bekommen?
Roman Starkov
8
Nein, -notist der einzige logische Operator, der mit einer Alternative help about_Logical_Operatorsgeliefert wird (siehe ), und Operatoren können nicht als Alias ​​verwendet werden.
Rynant
14
Danke, mir fehlte die Tatsache, dass die Verwendung der !erforderlichen Klammern.
Ganzheitlicher Entwickler
@ Holistic-Developer !selbst benötigt keine Klammern. Zumindest nicht in PS3.
Llyle
9
Der Begriff '! Test-Path' wird nicht als Name eines Cmdlets erkannt ... :)
sodawillow
9

Wenn Sie wie ich sind und die doppelte Klammer nicht mögen, können Sie eine Funktion verwenden

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

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

Beispiel

Steven Penny
quelle
1
Ich mag das, kann diese notImplementierung aber wahrscheinlich nicht überall verwenden ( not Test-Path -path C:\Codefunktioniert zum Beispiel nicht). Siehe auch diesen verwandten Beitrag .
Orad
2
Perl hat eine logischere, im vulkanischen Sinne, Redewendung namens "Es sei denn", die als Funktion geschrieben ist. Da ich halb Vulkanier bin, bevorzuge ich es und habe es sowohl in C # als Funktion als auch in C und C ++ als Makro implementiert.
David A. Gray
1
@ DavidA.Gray Ruby hat unlessals Schlüsselwort (genau wie if), aber die meisten Benutzer aus anderen Sprachen hassen es.
Franklin Yu
3

Powershell akzeptiert auch den Operator C / C ++ / C * not

if (! (Testpfad C: \ Code)) {schreibe "es existiert nicht!" }}

Ich benutze es oft, weil ich an C * gewöhnt bin ...
ermöglicht die Komprimierung / Vereinfachung von Code ...
ich finde es auch eleganter ...

ZEE
quelle
0

Wenn Ihnen die doppelten Klammern nicht gefallen oder Sie keine Funktion schreiben möchten, können Sie einfach eine Variable verwenden.

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