Як я заперечую умову в PowerShell?


273

Як я заперечую умовний тест у PowerShell?

Наприклад, якщо я хочу перевірити каталог C: \ Code, я можу запустити:

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

Чи є спосіб заперечити цю умову, наприклад (неробочий):

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

Обхід :

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

Це прекрасно працює, але я вважаю за краще щось вбудоване.

Відповіді:


508

Ви майже мали це Not. Вона повинна бути:

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

Ви також можете використовувати !:if (!(Test-Path C:\Code)){}

Для розваги ви також можете використовувати ексклюзивні розряди або, хоча це не самий читабельний / зрозумілий метод.

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

2
Цікаво, так -notпоходить традиційна !тоді альтернатива ? Чи можу я якось отримати традиційні альтернативи для -eqі -neтеж?
Роман Старков

8
Ні, -notце єдиний логічний оператор, який постачається з альтернативою (див. help about_Logical_Operators), І оператори не можуть бути псевдоніми.
Рюнант

14
Дякую, мені не вистачало факту використання !необхідних дужок.
Holistic Developer

@ Holistic-Developer !сам по собі не потребує дужок. Принаймні, не в PS3.
Llyle

9
Термін "! Test-Path" не визнається назвою cmdlet ... :)
sodawillow

9

Якщо ви схожі на мене і не любите подвійні дужки, ви можете використовувати функцію

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

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

Приклад


1
Мені це подобається, але, ймовірно, не можна використовувати цю notреалізацію скрізь (наприклад not Test-Path -path C:\Code, не працюватиме) Дивіться також цей пов’язаний пост .
орад

2
У Perl є більш логічна, у вулканському сенсі, ідіома, що називається «Без», яка пишеться як функція. Будучи наполовину Вулканом, я вважаю за краще, і реалізував це як у C #, як у функції, так і в C та C ++, як макрос.
Девід А. Грей

1
@ DavidA.Gray Ruby має unlessключове слово (як і зараз if), але більшість користувачів з інших мов ненавидять його.
Франклін Ю

3

Powershell також приймає оператора C / C ++ / C * not

if (! (Test-Path C: \ Code)) {напишіть "його не існує!" }

Я використовую його часто, тому що я звик до C * ...
дозволяє стиснути / спростити код ...
Я також вважаю його більш елегантним ...


0

якщо вам не подобаються подвійні дужки або ви не хочете писати функції, ви можете просто використовувати змінну.

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.