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

В этой статье вы узнаете о различных способах использования 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
для проверки файла.
Например, если вам нужно проверить, существует ли файл с именем C:\temp\important_file.txt, используйте следующий код. Обратите внимание, что часть -PathType Leaf
указывает командлету проверять наличие файла, а не каталога явно.
При выполнении указанной выше команды в PowerShell результат будет True, если файл существует. В противном случае результат будет False, как показано на скриншоте ниже.

Связано: Как использовать командлет Test-Path в PowerShell
Пример: Создание файла, если файл не существует
Этот пример является типичным случаем использования для создания файлов в указанном местоположении. Чтобы избежать ошибки “файл уже существует“, скрипт проверяет, существует ли файл, прежде чем создавать его. Если файл существует, скрипт выводит сообщение и больше не пытается создавать файл.
Скопируйте код ниже и сохраните его в файле с именем Create-NewFile.ps1. Обязательно измените значение переменной $path
, если хотите изменить местоположение вывода файла. После сохранения скрипта запустите его в PowerShell для тестирования.
Скриншот ниже показывает два разных вывода. Первый – при запуске скрипта, когда файл не существует. Второй – после создания файла, когда он уже существует.

Связано: Возвращение к основам: Как выполнить сценарий PowerShell
Использование Get-Item и Get-ChildItem
Назначение командлета Get-Item
заключается в том, чтобы получить элемент в указанном местоположении. В свою очередь, командлет Get-ChildItem
предназначен для получения элементов и дочерних элементов в одном или нескольких указанных местоположениях. Функциональность этих двух командлетов не предполагает явной проверки существования файлов.
Что происходит, когда вы используете Get-Item
или Get-ChildItem
для получения несуществующего элемента? Вы получите ошибку для каждого отсутствующего файла. Рассмотрим приведенные ниже команды в качестве примера.
Предположим, что файл c:\temp\important_file.txt не существует. Каждая из приведенных выше команд возвращает ошибку. Как видно из примера ниже, сообщение об ошибке для обеих команд одинаковое.

Пример: Архивирование существующего файла и создание нового файла
В этом примере скрипт использует командлеты Get-Item
и Test-Path
. Логика этого скрипта заключается в выполнении следующих действий:
- Проверьте, существует ли папка архива, используя
Test-Path
.- Если папка архива не существует, скрипт создает новую папку архива в следующем формате –
yyyy-MMM-dd_hh-mm-ss-tt
. - Затем скрипт перемещает старый файл в папку архива.
- Если папка архива не существует, скрипт создает новую папку архива в следующем формате –
- Проверьте, существует ли файл, используя
Get-Item
.- Если файл существует, скрипт сначала перемещает его в папку архива. Затем скрипт создает новый файл в оригинальном местоположении.
- Если файл не существует, скрипт создает новый файл.
Скопируйте код ниже и сохраните его как Create-NewFileAfterArchive.ps1. После сохранения скрипта выполните его в PowerShell и проверьте результаты.
Совет: Параметр
-ErrorAction Ignore
подавляет ошибку (она не будет отображаться в консоли) и также не записывает ошибку в автоматическую переменную$error
.
На скриншоте ниже первый запуск скрипта создал файл c:\temp\important_file.txt. Последующие выполнения скрипта создают новую папку архива каждый раз, перемещают существующий файл в папку архива, а затем создают новый файл в c:\temp\important_file.txt.

Использование метода .NET [System.IO.File]::Exists()
Последний метод, который нужно изучить в этой статье, это класс .NET System.IO.File, в частности метод Exists()
. Одним из преимуществ PowerShell является его способность импортировать и использовать классы и методы .NET.
Например, чтобы использовать метод Exists()
в PowerShell для проверки существования файла, используйте следующий код.
Вышеуказанный метод возвращает логический результат – true или false. Если результат равен true, это означает, что целевой файл существует. В противном случае возвращается результат false, если целевой файл не существует.
В приведенном ниже примере кода команда проверяет наличие файла c:\temp\important_file.txt.
Как видно из результата ниже, возвращается true, подтверждая существование файла.

С помощью этого метода .NET также можно использовать операции тернарного оператора, как показано в приведенном ниже примере. Вместо отображения стандартных результатов true или false, вы можете настроить сообщение с более короткой реализацией. Однако тернарный оператор в этом примере применяется только к PowerShell 7+.
Пример: Обновление содержимого файла, если файл существует
Этот пример скрипта обновляет текстовый файл, добавляя новое значение GUID. Однако обновление содержимого происходит только в том случае, если файл существует. В противном случае скрипт выводит сообщение и ничего не делает.
Скопируйте скрипт ниже и сохраните его как Update-FileContents.ps1. Если нужно, измените значение пути файла переменной $file
. Затем запустите скрипт в PowerShell для тестирования.
Вы можете видеть на скриншоте ниже, что скрипт обновил файл при каждом запуске. Обновление произошло потому, что метод [System.IO.File]::Exists()
подтвердил, что файл c:\temp\important_file.txt существует.
В конце концов, используя команду gc c:\temp\important_file.txt
для чтения содержимого файла, подтвердилось, что скрипт обновил файл значениями GUID.

Связано: Использование ускорителей типов данных 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/