Проверка существования файла и папки в Powershell Test-Path


12 августа 2019


Test-Path в Powershell проверка существования файла и папки

Powershell Test-Path проверяет весь путь на наличие папки или файла. Если хотя бы один элемент пути не существует, то команда вернет False при этом нельзя исключать корректность синтаксиса.

В этом варианте команда вернет True:

Test-Path -Path 'C:\Program Files\'

А в этом ошибку т.к. мы не экранировали путь в кавычки:

Test-Path -Path C:\Program Files\

Test-Path : A positional parameter cannot be found that accepts argument 'Files\'.
Test-Path : Не удается найти позиционный параметр, принимающий аргумент "Files\".

powershell проверка наличия папки

У нас есть ключ PathType проверяющий существование отдельного элемента пути. Написав:

  • Container - проверяет существование папки будь то обычный каталог или реестр.
  • Leaf - файл или любой другой элемент, который не содержит в себе другие элементы.
  • Any - либо контейнер, либо лист (leaf).

Т.е. такая команда вернет False, т.к. конечный элемент это файл, а не директория:

Test-Path -PathType Container -Path 'C:\Program File1s\desktop.ini'

По умолчанию команда проверяет путь и файл.

 

Фильтрация в Powershell Test-Path

Мы можем предполагать, что в папке находиться файл с неизвестным именем и хотим проверить это. В самом ключе Path возможно использовать простые маски. Выполнив следующую команду у нас вернется True, если в папке находится хотя бы один файл заканчивающийся на .txt:

#file exists
Test-Path -PathType Leaf -Path "C:\*.txt"

Аналогично, если мы проверяем путь, причем промежуточный:

Test-Path -Path 'C:\Wind*\System32\'

Доступен ключ IsValid и он должен валидировать путь на корректное написание. Если мы его установим, то вместо того что бы проверять существование пути будет проверяться корректность написания:

Test-Path -IsValid -Path "C:\Windows\System32\@AppHelpToast.png"

Test-Path IsValid

Достаточно странный ключ и похоже он проверяет только эти символы в пути: " * : < > ? | , хотя при создании запрещен еще и другой слэш.

Есть еще два интересных ключа:

  • Include - включает проверку объекта
  • Exclude - исключает проверку объекта

С помощью этих ключей мы можем проверить, например, существует ли в папке документы *.txt и *.docx одновременно или узнать есть ли что-то кроме *.jpg. Для работы с этими параметрами нужно указать * в конце пути как на примере:

Test-Path -Include "*.log" -Path "C:\Windows\*"

Powershell Include Exclude

Похожие маски мы можем делать и для ключа Filter, но он принимает только одно значение:

Test-Path -Path "C:\Windows\*" -Filter "*.log"

Test-Path filter

Проверка в Powershell наличия сетевой папки и файла

Можно проверять сетевой путь через эту команду, но многие отписываются о багах (у меня их не было):

Test-Path -Path "\\192.168.3.100\Folder2\*" -Include "*.txt"
#check share folder
Test-Path "X:\*" -Include "*.txt"

test-path check share folder

Папку, как видно, я подключал через команду New-SmbMapping описанной раннее.

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

[System.IO.Directory]::Exists("C:\")

Второй вариант, где AD1 имя сервера, а Folder2 папка:

Test-Path $('filesystem::\\AD1\Folder2\')

test-path check share folder

...

Теги: #powershell


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