Если вам нужно проверить путь к файлу, ключу реестра, сертификату или любому другому пути диска 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, которые появляются у вас.

Все эти диски имеют пути внутри них, такие как 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
.
Та же техника может быть использована и для любого другого пути к элементу. Возможно, вы хотите проверить, существует ли ключ реестра HKLM:\Software\Foo. Просто используйте путь к ключу реестра с параметром Path
.
Знайте, что все техники, продемонстрированные в этом учебнике, будут работать с любым путем к диску PowerShell.
Использование подстановочных символов
Что произойдет, если вам не важно, содержит ли путь конкретное значение. Вместо этого вы хотели бы проверить, соответствует ли путь определенному шаблону. В этом случае вы можете использовать подстановочные символы в значении параметра Path
.
Возможно, вы хотите проверить, содержит ли ваша папка C:\Foo какую-либо подпапку, начинающуюся с Bar. В этом случае вы можете использовать подстановочный символ.
Как только вы выполните вышеуказанную команду, Test-Path
проверит наличие любой папки, начинающейся с Bar, и вернет True
или False
в зависимости от того, существует ли папка, соответствующая этим критериям, или нет.
Звездочки (*
) соответствуют одному или более символам, но вы также можете использовать знаки вопроса (?
), чтобы получить более детализированный результат и проверить наличие одного символа.
Используя приведенный выше сценарий в качестве примера, если папка C:\Foo\Bar1 существует, вы можете проверить наличие любой подпапки Foo, начинающейся с Bar и состоящей ровно из четырех символов, с помощью следующей команды.
Если по какой-то причине вы хотите использовать параметр
Path
с использованием маски, но при этом буквально совпадать с символом подстановки, таким как*
, вы всегда можете экранировать символы подстановки обратной кавычкой (`).
LiteralPath
Параметр LiteralPath
практически идентичен параметру Path
за исключением одного; он не позволяет использовать маски. При использовании LiteralPath
значение пути будет буквально интерпретироваться.
Например, если вы попытаетесь использовать звездочку или вопросительный знак в значении пути с помощью LIteralPath
, Test-Path
полностью проигнорирует символы маски и буквально проверит C:\Foo\Bar?, как в приведенном ниже примере.
Вы должны использовать
LiteralPath
в качестве параметра пути по умолчанию, если вам не нужно использовать символы маски, чтобы убедиться, чтоTest-Path
проверяет путь, который вы ожидаете.
PathType
По умолчанию, когда вы запускаете Test-Path
и указываете путь, он вернет True
, если найдет что-либо по этому пути. Элементом с путем может быть контейнер, такой как папка с файлами, ключ реестра, хранилище сертификатов и так далее, или лист, такой как файл, значение реестра или сертификат.
Вы можете заставить Test-Path
работать более детализированно и проверять специально контейнер или лист, используя параметр PathType
.
По умолчанию
Test-Path
использует значениеAny
дляPathType
.
Например, если есть папка по пути C:\Foo\Bar, и вы ищете файл по этому пути, вы можете использовать параметр PathType
, как показано ниже. Вы хотите проверить только существует ли файл с именем C:\Foo\Bar.
Возможно, вам нужно подтвердить, является ли C:\Foo\Bar фактически файлом. В этом случае вы проверили бы контейнер.
Включите
Если вы используете параметр Path
и шаблоны, вам иногда нужно быть более специфичным. В этом случае вам нужно использовать параметры Include
и Exclude
.
Допустим, у вас есть следующие папки:
- C:\Foo\Bar1
- C:\Foo\Bar2
- C:\Foo\Bar3
Вы хотели бы проверить, существует ли какая-либо папка, которая начинается с Bar и имеет ровно четыре символа, например Bar1, Bar2 и так далее.
Вышеуказанная команда работает нормально, но теперь вы хотите найти только папки в C:\Foo с именем Bar2. В этом случае вы можете использовать параметр Include
.
Команда выше теперь проверяет фактически только одну папку C:\Foo\Bar2. Вероятно, вам будет лучше использовать просто Test-Path -Path 'C:\Foo\Bar2' -PathType Container
вместо этого.
Исключить
Параметр Exclude
работает аналогично параметру Include
, за исключением того, что в этом случае он исключает пути, соответствующие строке.
Возможно, вы хотите убедиться, что внутри папки C:\Foo есть хотя бы один файл, и вы используете следующую команду:
Вышеуказанная команда возвращает True
или False
, если в C:\Foo есть файлы. Но, возможно, вы хотите убедиться, что есть любые файлы кроме тех, у которых расширение файла txt
. В этом случае вы можете использовать параметр 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
следующим образом.
OlderThan
Параметр OlderThan
полностью аналогичен параметру NewerThan
, но наоборот. Этот параметр проверяет, является ли элемент старше указанной даты.
IsValid
Если вы когда-либо динамически создавали путь в сценарии, вы знаете, насколько это бывает сложно. Иногда вы можете нажать на клавишу слишком сильно или по ошибке добавить какой-то специальный символ в путь; если это так, то параметр IsValid
для вас.
Параметр IsValid
– это уникальный параметр, который превращает Test-Path
не в командлет, который проверяет существование элемента, а в командлет, который проверяет синтаксис пути. Этот параметр подтверждает, является ли путь допустимым только.
Например, вам может потребоваться проверить, является ли путь синтаксически корректным. Вы работаете с несколькими переменными и объединяете их для создания пути.
При объединении путей всегда используйте командлет
Join-Path
. Это просто для примера!
Теперь, чтобы убедиться, что созданный вами динамический путь является корректным, используйте параметр IsValid
следующим образом. Вы увидите, что Test-Path
возвращает значение 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: лучший способ выполнения удаленного кода