Лучший способ проверить, существует ли путь в PowerShell

Мне просто не нравится синтаксис:

if (Test-Path $path) { ... } 

а также

 if (-not (Test-Path $path)) { ... } if (!(Test-Path $path)) { ... } 

особенно слишком много скобок и не очень читаемо при проверке «не существует» для такого общего использования. Что это лучший способ сделать это?

Обновление. Мое текущее решение заключается в использовании псевдонимов для exist и not-exist как описано здесь .

Связанная проблема в репозитории PowerShell: https://github.com/PowerShell/PowerShell/issues/1970

Если вам просто нужна альтернатива синтаксису командлета, особенно для файлов, используйте метод File.Exists() .NET:

 if(![System.IO.File]::Exists($path)){ # file with path $path doesn't exist } 

Если, с другой стороны, вы хотите, чтобы псевдоним для Test-Path скомпрометирован в целом, вот как вы должны это делать:

 # Gather command meta data from the original Cmdlet (in this case, Test-Path) $TestPathCmd = Get-Command Test-Path $TestPathCmdMetaData = New-Object System.Management.Automation.CommandMetadata $TestPathCmd # Use the static ProxyCommand.GetParamBlock method to copy # Test-Path's param block and CmdletBinding attribute $Binding = [System.Management.Automation.ProxyCommand]::GetCmdletBindingAttribute($TestPathCmdMetaData) $Params = [System.Management.Automation.ProxyCommand]::GetParamBlock($TestPathCmdMetaData) # Create wrapper for the command that proxies the parameters to Test-Path # using @PSBoundParameters, and negates any output with -not $WrappedCommand = { try { -not (Test-Path @PSBoundParameters) } catch { throw $_ } } # define your new function using the details above $Function:notexists = '{0}param({1}) {2}' -f $Binding,$Params,$WrappedCommand 

notexists теперь будут вести себя точно так же, как Test-Path , но всегда возвращают противоположный результат:

 PS C:\> Test-Path -Path "C:\Windows" True PS C:\> notexists -Path "C:\Windows" False PS C:\> notexists "C:\Windows" # positional parameter binding exactly like Test-Path False 

Как вы уже показали, противоположное довольно легко, просто псевдоним exists для Test-Path :

 PS C:\> New-Alias exists Test-Path PS C:\> exists -Path "C:\Windows" True 

Вышеупомянутое решение alias является умным, но я бы возражал против его использования в сценариях, по той же причине, что мне не нравится использование каких-либо псевдонимов в скриптах; он имеет тенденцию ухудшать читаемость.

Если это то, что вы хотите добавить в свой профиль, чтобы вы могли набирать быстрые команды или использовать его как оболочку, тогда я мог видеть, что это имеет смысл.

Вместо этого вы можете подумать о трубопроводе:

 if ($path | Test-Path) { ... } if (-not ($path | Test-Path)) { ... } if (!($path | Test-Path)) { ... } 

Альтернативно, для отрицательного подхода, если это необходимо для вашего кода, вы можете сделать его положительным, а затем использовать else для отрицательного:

 if (Test-Path $path) { throw "File already exists." } else { # The thing you really wanted to do. } 

Добавьте следующие псевдонимы. Я думаю, что они должны быть доступны в PowerShell по умолчанию:

 function not-exist { -not (Test-Path $args) } Set-Alias !exist not-exist -Option "Constant, AllScope" Set-Alias exist Test-Path -Option "Constant, AllScope" 

При этом условные операторы изменятся на:

 if (exist $path) { ... } 

а также

 if (not-exist $path)) { ... } if (!exist $path)) { ... } 
  • Является ли PowerShell полной заменой консоли / cmd?
  • Как вызвать пакетный скрипт из Powershell?
  • Оператор PowerShell и -contains
  • Как заменить несколько строк в файле с помощью PowerShell
  • Powershell Calling .NET Assembly, использующая App.config
  • Конфигурирование истории файлов Windows 8 / 8.1 / 10 с помощью командной строки
  • Получить разрешение экрана с помощью WMI / powershell в Windows 7
  • PowerShell - Как определить несколько команд в псевдониме?
  • Изменить каталог в пакетном файле с помощью PowerShell
  • Powershell with exchange-Как добавить весь подробный вывод в файл
  • Общие коллекции PowerShell
  • Interesting Posts

    Как рассчитать наилучшее числоOfPartitions для объединения?

    Блокировать всплывающее окно Bypass на window.open, когда установлен JQuery event.preventDefault ()

    Считается ли приемлемым не вызывать Dispose () в объекте задачи TPL?

    Как передать объекты в функции на C ++?

    Начать процесс с высоким приоритетом

    R gotcha: логический – и оператор для комбинирования условий – & not &&

    Способ записи загрузочного компакт-диска в раздел?

    Установите изображение в ImageView, сохраните пропорции и измените размер ImageView на размеры изображения?

    Устаревшая анимация SMIL SVG заменена эффектами CSS или веб-анимации (наведите курсор, щелкните)

    Почему мой SSH-вход медленный?

    Не удалось слияние манифеста: uses-sdk: minSdkVersion 8 не может быть меньше

    Передайте вектор имен переменных, чтобы упорядочить () в dplyr

    Пользовательский интерфейс IISExpress

    получить имя приложения из имени пакета

    Как получить IP-адрес эмулятора Android?

    Давайте будем гением компьютера.