Как отменить условие в PowerShell?

274

Как отменить условный тест в 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!"}
Rynant
источник
2
Интересно, так что же -notприходит с традиционной альтернативой !тогда? Могу ли я как-то получить традиционные альтернативы для -eqи -neтоже?
Роман Старков
8
Нет, -notэто единственный логический оператор, который поставляется с альтернативой (см. help about_Logical_Operators), И операторы не могут быть псевдонимами.
Rynant
14
Спасибо, мне не хватало факта использования !обязательных скобок.
Целостный разработчик
@ Holistic-Developer !сам по себе не требует скобок. По крайней мере, не в PS3.
Ллайл
9
Термин «! Test-Path» не распознается как имя командлета ... :)
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 есть более логичная, в вулканском смысле, идиома, называемая Unless, которая написана как функция. Будучи наполовину вулканцем, я предпочитаю это, и реализовал это и в C #, как функцию, и в C и C ++, как макрос.
Дэвид А. Грей,
1
@ DavidA.Gray Ruby имеет unlessключевое слово (как и все if), но большинство пользователей из других языков ненавидят его.
Франклин Ю
3

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

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

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

ZEE
источник
0

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

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Мельхиор Канненгисер
источник