2011-11-11 10 views
175

Jak negować test warunkowy w PowerShell?Jak negować warunek w PowerShell?

Na przykład, jeśli chcę, aby sprawdzić w katalogu C: \ Kodeksu mogę uruchomić:

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

Czy istnieje sposób, aby negować tego warunku, np (Bez pracy):

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

Obejście:

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

Działa to dobrze, ale wolałbym coś inline.

Odpowiedz

323

Prawie udało się to z Not. Powinno być:

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

Można również użyć !: if (!(Test-Path C:\Code)){}

Tak dla zabawy, można również użyć bitowe lub wyłączne, choć nie jest to najbardziej czytelny/sposób zrozumiały.

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

interesujący, więc '-not' pochodzi z tradycyjną alternatywą'! ' następnie? Czy w jakiś sposób mogę uzyskać tradycyjne alternatywy dla '-eq' i' -ne'? –

+6

Nie, '-not' jest jedynym logicznym operatorem dostarczanym z alternatywnym (zobacz' help about_Logical_Operators'), a operatory nie mogą być aliasingowane. – Rynant

+6

Dzięki, brakowało mi faktu, że użycie '!' Wymagało nawiasów. –

8

Jeśli jesteś podobny do mnie i nie lubią podwójny nawias, można użyć funkcji

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

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

Example

+0

Podoba mi się to, ale prawdopodobnie nie można użyć tej implementacji "not" wszędzie (na przykład 'nie test-ścieżka - ścieżka C: \ Code' nie działa). Zobacz także ten związany [post] (http://stackoverflow.com/q/31888580/450913). – orad