Поиск по сайту:

Как использовать командлет Test-Path в PowerShell


При работе с файлами или папками в PowerShell важно проверить, существует ли путь, прежде чем вы попытаетесь прочитать или сохранить содержимое. Здесь на помощь приходит cmdlet Test-Path. Он проверяет, существуют ли все элементы пути, и возвращает $true или $false.

Теперь cmdlet Test-Path в PowerShell не ограничивается только файлами и папками. Его также можно использовать для тестирования пути реестра, проверки, является ли файл новее определенной даты, и для проверки, является ли путь допустимым.

В этой статье мы рассмотрим, как использовать командлет Test-Path и различные варианты, которые с его помощью можно сделать.

PowerShell Test-Path

Команда Test-Path в PowerShell имеет разные параметры, которые мы можем использовать. Я перечислил наиболее часто используемые параметры ниже:

-Path

Путь для тестирования

-Include

Указывает элемент пути для включения, например, *.txt

-Exclude

Указывает элемент пути для исключения, например, *.txt

-PathType

Позволяет проверить, является ли путь контейнером, листом или тем и другим

-IsValid

Проверьте, является ли путь допустимым

-OlderThan

Проверьте, старее ли файл, чем указанный объект даты и времени.

-NewerThan

Проверьте, новее ли файл, чем указанный объект даты и времени.

Параметры Test-Path

Таким образом, чтобы просто проверить, существует ли путь, нам нужно только указать Путь, и команда вернет либо $true, либо $false в зависимости от того, существуют ли все элементы пути или нет:

Test-Path -Path "c:\Temp\TestFiles"

Result
True

Мы можем использовать это в наших скриптах с простым оператором if, как это:

$path = "c:\Temp\TestFiles"

if (Test-Path -Path $path) {
  Get-ChildItem -Path $path
}

PowerShell проверьте, существует ли файл

Мы также можем использовать Test-Path в PowerShell, чтобы проверить, существует ли файл. Для этого нам нужно указать полный путь с именем файла в параметре пути:

Check if the file LineNumbers.txt exists
$file = "C:\Temp\TestFiles\LineNumbers.txt"
Test-Path -Path $file

Result
True

В этом случае мы явно проверяем наличие файла, потому что указали полный путь, включая файл с расширением. Но если вы не уверены, ведет ли путь к файлу или папке, вы можете указать параметр PathType.

Допустим, мы хотим узнать, указывает ли $profile на файл. Для этого мы устанавливаем PathType в Leaf:

Check if $profile is a file:
Test-Path -Path $profile -PathType leaf

Result
True

PowerShell проверьте, существует ли папка

Так же, как и с файлом, мы можем проверить в PowerShell, существует ли папка. Для этого нам нужно только указать путь к папке:

Test-Path -Path "c:\Temp\TestFiles"

Result
True

Если мы хотим быть уверены, что путь указывает на папку, мы можем добавить параметр -PathType и установить его в container. Таким образом, командлет Test-Path проверит не только существует ли путь, но и является ли он папкой или нет:

Check if $profile is a folder:
Test-Path -Path $profile -PathType container

Result
False

Если вы хотите узнать, содержит ли папка файлы, то вам не нужно делать подсчет с помощью Get-ChildItem и т.д. Мы можем просто использовать Test-Path и добавить подстановочный знак *, чтобы проверить, есть ли файлы в указанном пути:

Check if there are files in the folder
Test-Path -Path "c:\Temp\TestFiles\*"

Result
True

Используя Включить и Исключить

Если вы хотите проверить, содержит ли папка определенные файлы или нет, вы можете использовать параметры -include и -exclude. Таким образом, мы можем проверить, содержит ли папка указанный тип файла или любой файл, кроме указанного типа файла.

Например, мы хотим проверить, существуют ли файлы журнала по следующему пути:

Check if the path contains .log files
Test-Path -Path "C:\Temp\TestFiles\*" -PathType leaf -Include *.log

Result
False

Если мы хотим проверить, есть ли какие-либо файлы, кроме файла .log, то мы можем использовать исключение, например:

Check if the path contains .log files
Test-Path -Path "C:\Temp\TestFiles\*" -PathType leaf -Exclude *.log

Result
True

Проверить, является ли путь допустимым

Когда вы динамически создаете путь в своем скрипте, хорошей идеей может быть проверить, действительно ли сгенерированный путь является действительным. Для этого мы можем использовать параметр -IsValid. Это не проверит, существует ли путь или нет, только является ли он действительным.

Например, мы можем проверить, являются ли все расположения в системной переменной PATH действительными путями или нет:

$env:path -split ";" | Test-Path -IsValid

Или, возможно, немного более простой пример:

$storage = "c:\temp\testfiles\"
$newFolder = "\LazyFolder"
$path = $newFolder + $storage # yes, the wrong way around

Test-Path -path $path -IsValid

Result
False

Проверьте, является ли файл или папка новее или старше определенной даты

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

Параметры -NewerThan и -OlderThan требуют объекта даты или времени. Это может быть строка даты и времени или объект даты и времени. Таким образом, чтобы проверить, является ли папка «testfiles» новее первого февраля, мы можем сделать следующее:

Test-Path -Path "C:\Temp\TestFiles\" -NewerThan "01 feb 2023"

Result
True

Но мы также можем проверить, старее ли папка, чем 3 дня, например. Для этого мы сначала создаем объект даты в PowerShell, который затем можем использовать в команде Test-Path:

Get the date from 3 days ago
$date = (Get-Date).AddDays(-3)

Test if the folder is newer
Test-Path -Path "C:\Temp\TestFiles\" -NewerThan $date

Вы можете сделать то же самое с OlderThan, конечно.

Тестирование путей реестра с помощью PowerShell

Командлет Test-Path в PowerShell также можно использовать для проверки существования путей реестра. Однако важно отметить, что он не может тестировать записи реестра.

Если вы посмотрите на скриншот ниже, мы можем проверить, существует ли ключ Outlook (1) или нет. Но мы не можем проверить, существует ли запись «OutlookName» (2).

Чтобы протестировать ключ реестра, нам просто нужно указать путь к ключу следующим образом:

Test-Path -Path "HKCU:\Software\Microsoft\Office\16.0\Outlook"

Как вы можете видеть из результатов ниже, путь к ключу Outlook существует, но он не может найти путь к записи OutlookName:

Заключение

Проверка или подтверждение существования ресурсов важна в любом языке программирования или скриптования. Это помогает предотвратить ошибки или неожиданное поведение в ваших скриптах и позволяет правильно обрабатывать ошибки.

Команда Test-Path в PowerShell может делать больше, чем многие думают, но в любом случае она возвращает только true или false.

Я надеюсь, что вы нашли эту статью полезной. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.