Команда PowerShell Test-Path: Проверка файлов, ключей и других объектов

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

Команда Test-Path – это простой, но полезный способ быстрой проверки множества атрибутов файла и других элементов. Она может проверить, существует ли файл (или другие типы элементов), находится ли строка в правильном формате пути, а также, новее или старше ли элемент определенного времени.

В этом руководстве вы узнаете все о команде Test-Path в PowerShell и о том, как использовать ее для улучшения ваших сценариев PowerShell.

Предварительные требования

Если вы хотите следовать примерам в этом учебнике, вам понадобится одна вещь: PowerShell. Конкретно, в учебнике будет использоваться PowerShell v7.03 на Windows 10, хотя многие техники, которые вы узнаете, применимы и к более старым версиям.

Что делает команда Test-Path?

Команда Test-Path в PowerShell – одна из самых простых команд. Она возвращает только два значения: True или False.

Но не позволяйте простоте обмануть себя; она сэкономит вам так много времени при проверке информации в ваших сценариях PowerShell.

Думайте о командлете PowerShell Test-Path как о контроле качества при работе с провайдерами и дисками PowerShell. При написании скрипта вы часто будете работать с различными объектами, содержащимися в дисках PowerShell. Диски PowerShell, такие как C:\, HKLM, Cert и так далее.

Test-Path не работает со всеми дисками PS. Например, если вы попытаетесь использовать Test-Path против ключа реестра, это сработает. Если вы попытаетесь использовать Test-Path против значения реестра, он вернет False каждый раз.

Если вам интересно, запустите командлет Get-PSDrive прямо сейчас в PowerShell и обратите внимание на все диски PS, которые появляются у вас.

PS Drives after running Get-PSDrive

Все эти диски имеют пути внутри них, такие как C:\Windows, HKLM:\Software и т.д. При работе с путями в ваших скриптах PowerShell всегда хорошая практика сначала проверить, действителен ли путь или существует ли он. Это то, что делает Test-Path в PowerShell.

Test-Path определяет условие, которое возвращает True или False в зависимости от того, выполнено ли определенное условие (обычно существует ли файл/папка, ключ реестра, сертификат или даже переменная или нет).

Параметры и использование Test-Path

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

Путь

Параметр Path является обязательным параметром, который вы будете использовать при каждом выполнении Test-Path. Параметр Path определяет путь PSDrive, который вы хотели бы проверить на существование.

Например, если вы хотите проверить, существует ли папка C:\Foo, вы должны указать соответствующий путь в параметре Path. Затем, в зависимости от того, существует ли C:\Foo или нет, Test-Path вернет либо True, либо False.

PS> Test-Path -Path 'C:\Foo'
True

Та же техника может быть использована и для любого другого пути к элементу. Возможно, вы хотите проверить, существует ли ключ реестра HKLM:\Software\Foo. Просто используйте путь к ключу реестра с параметром Path.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

Знайте, что все техники, продемонстрированные в этом учебнике, будут работать с любым путем к диску PowerShell.

Использование подстановочных символов

Что произойдет, если вам не важно, содержит ли путь конкретное значение. Вместо этого вы хотели бы проверить, соответствует ли путь определенному шаблону. В этом случае вы можете использовать подстановочные символы в значении параметра Path.

Возможно, вы хотите проверить, содержит ли ваша папка C:\Foo какую-либо подпапку, начинающуюся с Bar. В этом случае вы можете использовать подстановочный символ.

PS> Test-Path -Path 'C:\Foo\Bar*'

Как только вы выполните вышеуказанную команду, Test-Path проверит наличие любой папки, начинающейся с Bar, и вернет True или False в зависимости от того, существует ли папка, соответствующая этим критериям, или нет.

Звездочки (*) соответствуют одному или более символам, но вы также можете использовать знаки вопроса (?), чтобы получить более детализированный результат и проверить наличие одного символа.

Используя приведенный выше сценарий в качестве примера, если папка C:\Foo\Bar1 существует, вы можете проверить наличие любой подпапки Foo, начинающейся с Bar и состоящей ровно из четырех символов, с помощью следующей команды.

PS> Test-Path -Path 'C:\Foo\Bar?'

Если по какой-то причине вы хотите использовать параметр Path с использованием маски, но при этом буквально совпадать с символом подстановки, таким как *, вы всегда можете экранировать символы подстановки обратной кавычкой (`).

LiteralPath

Параметр LiteralPath практически идентичен параметру Path за исключением одного; он не позволяет использовать маски. При использовании LiteralPath значение пути будет буквально интерпретироваться.

Например, если вы попытаетесь использовать звездочку или вопросительный знак в значении пути с помощью LIteralPath, Test-Path полностью проигнорирует символы маски и буквально проверит C:\Foo\Bar?, как в приведенном ниже примере.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

Вы должны использовать LiteralPath в качестве параметра пути по умолчанию, если вам не нужно использовать символы маски, чтобы убедиться, что Test-Path проверяет путь, который вы ожидаете.

PathType

По умолчанию, когда вы запускаете Test-Path и указываете путь, он вернет True, если найдет что-либо по этому пути. Элементом с путем может быть контейнер, такой как папка с файлами, ключ реестра, хранилище сертификатов и так далее, или лист, такой как файл, значение реестра или сертификат.

Вы можете заставить Test-Path работать более детализированно и проверять специально контейнер или лист, используя параметр PathType.

По умолчанию Test-Path использует значение Any для PathType.

Например, если есть папка по пути C:\Foo\Bar, и вы ищете файл по этому пути, вы можете использовать параметр PathType, как показано ниже. Вы хотите проверить только существует ли файл с именем C:\Foo\Bar.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

Возможно, вам нужно подтвердить, является ли C:\Foo\Bar фактически файлом. В этом случае вы проверили бы контейнер.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

Включите

Если вы используете параметр Path и шаблоны, вам иногда нужно быть более специфичным. В этом случае вам нужно использовать параметры Include и Exclude.

Допустим, у вас есть следующие папки:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

Вы хотели бы проверить, существует ли какая-либо папка, которая начинается с Bar и имеет ровно четыре символа, например Bar1, Bar2 и так далее.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

Вышеуказанная команда работает нормально, но теперь вы хотите найти только папки в C:\Foo с именем Bar2. В этом случае вы можете использовать параметр Include.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

Команда выше теперь проверяет фактически только одну папку C:\Foo\Bar2. Вероятно, вам будет лучше использовать просто Test-Path -Path 'C:\Foo\Bar2' -PathType Container вместо этого.

Исключить

Параметр Exclude работает аналогично параметру Include, за исключением того, что в этом случае он исключает пути, соответствующие строке.

Возможно, вы хотите убедиться, что внутри папки C:\Foo есть хотя бы один файл, и вы используете следующую команду:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

Вышеуказанная команда возвращает True или False, если в C:\Foo есть файлы. Но, возможно, вы хотите убедиться, что есть любые файлы кроме тех, у которых расширение файла txt. В этом случае вы можете использовать параметр Exclude, используя шаблон, чтобы исключить все файлы с расширением txt из тестирования.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

Фильтр

Согласно документации Microsoft, параметр Filter “указывает фильтр в формате или языке провайдера. Значение этого параметра квалифицируется как параметр Path. Синтаксис фильтра, включая использование символов подстановки, зависит от провайдера”.

Хотя параметр Filter следует использовать с другими командлетами, например, с Get-Childitem, например, его редко, если вообще, используют с Test-Path. Если у вас есть хорошее применение для параметра Filter, пожалуйста, свяжитесь с нами в Twitter по адресу @adbertram.

Связано: Get-ChildItem: Перечисление файлов, реестра, сертификатов и многого другого в одном

NewerThan

Вы когда-нибудь нуждались в проверке временной метки файла и принятии решения на ее основе? Если да, то параметры NewerThan и OlderThan сэкономят много кода. Параметр NewerThan проверяет, является ли временная метка элемента более поздней, чем указанная дата.

Параметр NewerThan принимает строку или объект DateTime для представления временной метки, с которой нужно сравнить. Например, чтобы проверить, был ли файл C:\Foo\bar.txt создан после 20 января 2021 года, выполните Test-Path следующим образом.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## или
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

Параметр OlderThan полностью аналогичен параметру NewerThan, но наоборот. Этот параметр проверяет, является ли элемент старше указанной даты.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## или
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

Если вы когда-либо динамически создавали путь в сценарии, вы знаете, насколько это бывает сложно. Иногда вы можете нажать на клавишу слишком сильно или по ошибке добавить какой-то специальный символ в путь; если это так, то параметр IsValid для вас.

Параметр IsValid – это уникальный параметр, который превращает Test-Path не в командлет, который проверяет существование элемента, а в командлет, который проверяет синтаксис пути. Этот параметр подтверждает, является ли путь допустимым только.

Например, вам может потребоваться проверить, является ли путь синтаксически корректным. Вы работаете с несколькими переменными и объединяете их для создания пути.

При объединении путей всегда используйте командлет Join-Path. Это просто для примера!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

Теперь, чтобы убедиться, что созданный вами динамический путь является корректным, используйте параметр IsValid следующим образом. Вы увидите, что Test-Path возвращает значение False.

PS> Test-Path -LiteralPath $path -IsValid
False

Путь abc:dffC:\ не является допустимым, что позволяет создать процедуру проверки на основе этой ситуации.

Если вы используете PowerShell v6.1.2 или более раннюю версию и используете параметры IsValid и PathType вместе, Test-Path будет игнорировать параметр PathType.

Учетные данные

Хотя вы найдете параметр Credential в командлете Test-Path, вы можете подумать, что можете использовать его для аутентификации в PS-дисках от имени другого пользователя. Это вполне логичное предположение, но оно неверно.

К сожалению, параметр Credential не имеет особого значения для командлета Test-Path. Microsoft рекомендует использовать командлет Invoke-Command и использовать параметр Credential там, если вы хотите вызвать Test-Path с альтернативными учетными данными.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

Связано: Invoke-Command: лучший способ выполнения удаленного кода

Source:
https://adamtheautomator.com/powershell-test-path/