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

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


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

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

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

Существует в основном два метода в PowerShell для проверки наличия файла. Рекомендуемый способ - использовать командлет Test-Path, а другой вариант - использовать командлет Get-ChildItem.

Лучший способ проверить, существует ли файл в PowerShell, - это использовать командлет Test-Cmdlet. Этот командлет вернет логическое значение, которое может быть $True или $False, что упрощает его использование внутри условного оператора, например.

Если вы выполните командлет напрямую в своей консоли, вы увидите, что он просто вернет True или False в виде строки:

Test-Path -Path "c:\temp\random-file.txt"

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

$path = "C:\temp\File1.txt"

if (-not(Test-Path -path $path)) {
    # File doesn't exists, create the file
    New-Item -Path $path
}

Вы также можете использовать подстановочные знаки в пути к файлу. Это позволяет сделать несколько вещей. Прежде всего, если вы не знаете точное имя файла, вы можете искать часть имени.

Он также позволяет вам проверить, есть ли в папке определенные типы файлов. Например, если вы хотите узнать, есть ли в папке файл журнала или файл bak.

Check for specific file type
if (Test-Path -path "c:\temp\*.bak") {
    Write-Host "Bak file(s) found in the folder"
}

Check on part of the file name
if (Test-Path -path "c:\temp\la-*.txt") {
    Write-Host "Found one or more files that start with la-"
}

Используя Get-ChildItem

Еще один способ проверить, существует ли файл в PowerShell, — это использование cmdlet Get-ChildItem. Этот cmdlet используется для получения заданных элементов из указанного каталога. Но мы также можем использовать этот cmdlet, чтобы проверить, существует ли файл.

Разница между командлетами Get-ChildItem и Test-Path заключается в том, что последний возвращает только True или False, тогда как первый также возвращает информацию о файле.

При использовании командлета Get-ChildItem вы не можете просто указать полный путь и имя файла. Причина в том, что если файл не существует, вы получите ошибку, которая остановит ваш скрипт:

This won't work if the file doesn't exist
$path = "c:\temp\non-existing-file.txt"
$file = Get-ChildItem -Path $path

if ($file) {
    # Do something with the file information
}else{
    Write-Host "File doesn't exist"
}

Чтобы использовать командлет Get-ChildItem для этого, нам нужно будет указать путь и имя файла, который мы ищем, отдельно.

Мы используем свойство Filter для фильтрации файлов в пути, которые соответствуют файлу, который мы ищем:

$path = "c:\temp\"
$fileName = "non-existing-file.txt"

Get all the files in the path and filter on filename
$file = Get-ChildItem -Path $path -Filter $fileName

if ($file) {
    # Do something with the file information
}else{
    Write-Host "File doesn't exist"
}

Искать в подпапках

Преимуществом командлета Get-ChildItem является то, что мы также можем искать файл в подпапках. Мы можем добавить параметр -recurse, чтобы он также искал во всех вложенных папках:

$path = "c:\temp\"
$fileName = "file1.txt"

$file = Get-ChildItem -Path $path -Filter $fileName -Recurse -File

if ($file) {
    # Do something with the file information
    Write-Host "File created on $($file.CreationTime)"
}

Как вы видите в приведенном выше примере, я также добавил параметр -File. В примерах я искал по имени файла, включая расширение, тогда это действительно не обязательно. Но когда вы ищете только по имени файла, тогда могут быть включены и директории. Параметр -File ограничит результат только файлами.

Заключение

Если вы хотите проверить, существует ли файл в PowerShell, то лучший вариант - использовать командлет Test-Path. Он возвращает True или False в зависимости от результата, что делает его лучшим вариантом для использования внутри скриптов.

Когда вы не знаете точное местоположение файла или хотите проверить, есть ли один или несколько файлов с определённым именем, команда Get-ChildItem является хорошим вариантом для использования.

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