Jak zanegować warunek w programie PowerShell?


273

Jak zanegować test warunkowy w programie PowerShell?

Na przykład, jeśli chcę sprawdzić katalog C: \ Code, mogę uruchomić:

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

Czy istnieje sposób na zanegowanie tego warunku, np. (Niedziałający):

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

Obejście :

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

To działa dobrze, ale wolałbym coś wbudowanego.

Odpowiedzi:


508

Prawie to masz Not. Powinno być:

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

Możesz także użyć !:if (!(Test-Path C:\Code)){}

Dla zabawy możesz również użyć wyłączności bitowej lub, choć nie jest to najbardziej czytelna / zrozumiała metoda.

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

2
Ciekawe, więc -notpochodzi z tradycyjną alternatywą !? Czy mogę jakoś uzyskać alternatywy dla tradycyjnych -eq, a -netakże?
Roman Starkov,

8
Nie, -notjest jedynym operatorem logicznym, który jest dostarczany z alternatywnym (patrz help about_Logical_Operators), a operatory nie mogą być aliasowane.
Rynant,

14
Dzięki, brakowało mi faktu, że użycie !wymaganych nawiasów.
Holistic Developer

@ !Sam Holistic-Developer nie wymaga nawiasów. Przynajmniej nie w PS3.
Llyle,

9
Termin „! Test-Path” nie jest rozpoznawany jako nazwa polecenia cmdlet ... :)
sodawillow

9

Jeśli jesteś podobny do mnie i nie lubisz podwójnego nawiasu, możesz użyć funkcji

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

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

Przykład


1
Podoba mi się to, ale prawdopodobnie nie mogę notwszędzie używać tej implementacji (na przykład not Test-Path -path C:\Codenie będzie działać). Zobacz także ten powiązany post .
orad

2
Perl ma bardziej logiczny, w sensie Vulcan, idiom, zwany Unless, który jest zapisany jako funkcja. Będąc w połowie Vulcanem, wolę go i zaimplementowałem go zarówno w C # jako funkcję, jak i w C i C ++ jako makro.
David A. Gray

1
@ DavidA.Gray Ruby ma unlessjako słowo kluczowe (podobnie jak if), ale większość użytkowników z innych języków go nienawidzi.
Franklin Yu

3

Program PowerShell akceptuje również operator C / C ++ / C * not

if (! (Test-Path C: \ Code)) {napisz „nie istnieje!” }

Używam go często, ponieważ jestem przyzwyczajony do C * ...
pozwala na kompresję / uproszczenie kodu ...
Uważam też, że jest bardziej elegancki ...


0

jeśli nie lubisz podwójnych nawiasów lub nie chcesz pisać funkcji, możesz po prostu użyć zmiennej.

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.