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.

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!"}

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


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


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!"
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.