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.

Ben McCormack
źródło

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!"}
Rynant
źródło
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

Steven Penny
źródło
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 ...

ZEE
źródło
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!"
}
Melchior Kannengießer
źródło