Проверка наличия файла в PowerShell: Полное руководство

Вы используете PowerShell для создания, чтения, обновления и удаления файлов? Если да, то, вероятно, вы сталкивались с ошибками, когда целевые файлы не существуют или уже существуют. К счастью, в PowerShell есть способы проверить, существует ли файл, прежде чем с ним что-либо делать.

Например, вместо того чтобы позволить вашему коду сразу создавать файл, лучше проверить, существует ли файл. Как показано на скриншоте ниже, вы можете написать более качественный код и получить четкий результат.

Creating a file that already exists

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

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

Снижайте количество обращений в службу поддержки и обновляйте учетные данные кэша для удаленных пользователей, даже вне VPN, с помощью решения для сброса пароля самообслуживания. Получите демонстрацию Specops uReset!

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

  • Редактор кода. Рекомендуемыми являются Visual Studio Code и Atom, которые работают на разных платформах. Вы также можете использовать Windows PowerShell ISE, если работаете на компьютере с Windows.
  • Windows PowerShell 5.1 (Desktop) или PowerShell 7.1 (Core). Команды и сценарии в этой статье применимы к обеим версиям PowerShell. Независимо от того, используете ли вы Windows, Linux или macOS, вам подойдет, если у вас установлен PowerShell.

См. также: Как скачать и установить PowerShell 7 на Windows, Linux и macOS

Использование PowerShell для проверки наличия файла

В этой статье рассматриваются три способа использования PowerShell для проверки наличия файла. Эти три метода различаются в использовании, но концепция и конечная цель одинаковы. Этими тремя способами являются:

  • Test-Path Командлет.
  • Get-Item и Get-ChildItem Командлеты.
  • System.IO.File Класс.

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

Использование Test-Path

Первый способ – это командлет Test-Path, специально предназначенный для определения существует ли путь или файл. При использовании этого командлета для проверки существования файла результатом будет true или false. Результат указывает, существует ли файл или нет.

Ниже приведен базовый синтаксис для использования командлета Test-Path для проверки файла.

Test-Path -Path <PATH to FILE> -PathType Leaf

Например, если вам нужно проверить, существует ли файл с именем C:\temp\important_file.txt, используйте следующий код. Обратите внимание, что часть -PathType Leaf указывает командлету проверять наличие файла, а не каталога явно.

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

При выполнении указанной выше команды в PowerShell результат будет True, если файл существует. В противном случае результат будет False, как показано на скриншоте ниже.

Using Test-Path in PowerShell to check if a file exists

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

Пример: Создание файла, если файл не существует

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

Скопируйте код ниже и сохраните его в файле с именем Create-NewFile.ps1. Обязательно измените значение переменной $path, если хотите изменить местоположение вывода файла. После сохранения скрипта запустите его в PowerShell для тестирования.

# Create-NewFile.ps1

# Полный путь к файлу
$file = 'c:\temp\important_file.txt'

# Если файл не существует, создайте его.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# Если файл уже существует, показать сообщение и ничего не делать.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

Скриншот ниже показывает два разных вывода. Первый – при запуске скрипта, когда файл не существует. Второй – после создания файла, когда он уже существует.

Running the PowerShell script to create a file

Связано: Возвращение к основам: Как выполнить сценарий PowerShell

Использование Get-Item и Get-ChildItem

Назначение командлета Get-Item заключается в том, чтобы получить элемент в указанном местоположении. В свою очередь, командлет Get-ChildItem предназначен для получения элементов и дочерних элементов в одном или нескольких указанных местоположениях. Функциональность этих двух командлетов не предполагает явной проверки существования файлов.

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

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

Предположим, что файл c:\temp\important_file.txt не существует. Каждая из приведенных выше команд возвращает ошибку. Как видно из примера ниже, сообщение об ошибке для обеих команд одинаковое.

Using Get-Item and Get-ChildItem in PowerShell to check if a file exists

Пример: Архивирование существующего файла и создание нового файла

В этом примере скрипт использует командлеты Get-Item и Test-Path. Логика этого скрипта заключается в выполнении следующих действий:

  • Проверьте, существует ли папка архива, используя Test-Path.
    • Если папка архива не существует, скрипт создает новую папку архива в следующем формате – yyyy-MMM-dd_hh-mm-ss-tt.
    • Затем скрипт перемещает старый файл в папку архива.
  • Проверьте, существует ли файл, используя Get-Item.
    • Если файл существует, скрипт сначала перемещает его в папку архива. Затем скрипт создает новый файл в оригинальном местоположении.
    • Если файл не существует, скрипт создает новый файл.

Скопируйте код ниже и сохраните его как Create-NewFileAfterArchive.ps1. После сохранения скрипта выполните его в PowerShell и проверьте результаты.

# Создать-НовыйФайлПослеАрхивации.ps1

# Полный путь к файлу
$file = 'c:\temp\important_file.txt'

# Полный путь к папке архивации
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# Если файл существует, переместите его в папку архивации, затем создайте новый файл.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## Если папка с архивом не существует, создайте ее сейчас.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## Переместите существующий файл в архив.
        Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
        Write-Host "The old file [$file] has been archived to [$archiveFolder]"
     } catch {
        throw $_.Exception.Message
     }
 }
 Create the new file
 try {
     $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
     Write-Host "The new file [$file] has been created."
 } catch {
    Write-Host $_.Exception.Message
 }

Совет: Параметр -ErrorAction Ignore подавляет ошибку (она не будет отображаться в консоли) и также не записывает ошибку в автоматическую переменную $error.

На скриншоте ниже первый запуск скрипта создал файл c:\temp\important_file.txt. Последующие выполнения скрипта создают новую папку архива каждый раз, перемещают существующий файл в папку архива, а затем создают новый файл в c:\temp\important_file.txt.

Running a script in PowerShell to check if a file exists using Get-Item

Использование метода .NET [System.IO.File]::Exists()

Последний метод, который нужно изучить в этой статье, это класс .NET System.IO.File, в частности метод Exists(). Одним из преимуществ PowerShell является его способность импортировать и использовать классы и методы .NET.

Например, чтобы использовать метод Exists() в PowerShell для проверки существования файла, используйте следующий код.

[System.IO.File]::Exists("PATH")

Вышеуказанный метод возвращает логический результат – true или false. Если результат равен true, это означает, что целевой файл существует. В противном случае возвращается результат false, если целевой файл не существует.

В приведенном ниже примере кода команда проверяет наличие файла c:\temp\important_file.txt.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file)

Как видно из результата ниже, возвращается true, подтверждая существование файла.

Using System.IO.File class in PowerShell

С помощью этого метода .NET также можно использовать операции тернарного оператора, как показано в приведенном ниже примере. Вместо отображения стандартных результатов true или false, вы можете настроить сообщение с более короткой реализацией. Однако тернарный оператор в этом примере применяется только к PowerShell 7+.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

Пример: Обновление содержимого файла, если файл существует

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

Скопируйте скрипт ниже и сохраните его как Update-FileContents.ps1. Если нужно, измените значение пути файла переменной $file. Затем запустите скрипт в PowerShell для тестирования.

# Update-FileContents.ps1

#Полный путь к файлу
$file = 'c:\temp\important_file.txt'

# Если файл существует, добавьте новое значение GUID в файл.
if ([System.IO.File]::Exists($file)) {
    try {
        $newValue = ((New-Guid).Guid)
        Add-Content -Path $file -Value $newValue -ErrorAction STOP
        Write-Host "The file [$file] has been updated with [$newValue]"
     } catch {
        throw $_.Exception.Message
     }    
 }

# Если файл не существует, покажите сообщение и ничего не делайте.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

Вы можете видеть на скриншоте ниже, что скрипт обновил файл при каждом запуске. Обновление произошло потому, что метод [System.IO.File]::Exists() подтвердил, что файл c:\temp\important_file.txt существует.

В конце концов, используя команду gc c:\temp\important_file.txt для чтения содержимого файла, подтвердилось, что скрипт обновил файл значениями GUID.

Using [System.IO.File]::Exists() .NET Method in PowerShell

Связано: Использование ускорителей типов данных PowerShell для ускорения кодирования

Заключение

Уменьшите звонки в службу поддержки и обновите кэш учетных данных для удаленных пользователей, даже вне VPN, с помощью решения сброса пароля через самообслуживание. Получите демонстрацию Specops uReset!

В этой статье вы узнали, что существует несколько способов использования PowerShell для проверки существования файла. Хорошей практикой является проверка наличия файла перед внесением каких-либо изменений, связанных с файлами.

Вы узнали о том, как использовать cmdlets Get-Item, Get-ChildItem и Test-Path. А также о методе [System.IO.File]::Exists() .NET. Примеры показали вам, как использовать эти техники и как комбинировать их с логикой обработки ошибок.

Прекратите мучиться из-за этих сообщений об ошибках. Преодолейте их, добавив код для проверки существования файла перед выполнением любых операций с файлами. Техники, которые вы изучили здесь, охватывают только основы, и теперь ваша задача – совершенствовать их.

Source:
https://adamtheautomator.com/powershell-check-if-file-exists/