Поделиться через


Работа с файлами и папками

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

Перечисление всех файлов и папок в папке

Все элементы можно получить непосредственно в папке с помощью Get-ChildItem. Добавьте необязательный параметр Force для отображения скрытых или системных элементов. Например, эта команда отображает прямое содержимое диска PowerShell C:.

Get-ChildItem -Path C:\ -Force

Команда перечисляет только непосредственно содержащиеся элементы, подобно использованию команды dir в cmd.exe или ls в оболочке Unix. Чтобы отобразить элементы в вложенной папке, необходимо указать параметр Recurse. Следующая команда содержит список всех элементов на диске C::

Get-ChildItem -Path C:\ -Force -Recurse

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

Следующая команда находит все исполняемые файлы в папке Program Files, которые были изменены после 1 октября 2005 года, и они не меньше 1 мегабайт или больше 10 мегабайт:

Get-ChildItem -Path $Env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Копирование файлов и папок

Копирование выполняется с помощью Copy-Item. Следующая команда создает резервную копию скрипта профиля PowerShell:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

Команда Test-Path проверяет, существует ли скрипт профиля.

Если целевой файл уже существует, попытка копирования завершается ошибкой. Чтобы перезаписать уже существующее местоположение, используйте параметр Force.

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

Эта команда работает даже в том случае, если назначение доступно только для чтения.

Копирование папок работает так же. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Вы также можете скопировать выбор элементов. Следующая команда копирует все файлы .txt, содержащиеся в любом месте C:\data, в C:\temp\text:

Copy-Item -Filter *.txt -Path C:\data -Recurse -Destination C:\temp\text

Вы по-прежнему можете выполнять собственные команды, такие как xcopy.exe и robocopy.exe для копирования файлов.

Создание файлов и папок

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

Эта команда создает новую папку C:\temp\New Folder:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Эта команда создает пустой файл C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Это важно

При использовании переключателя принудительно с командой New-Item для создания папки, если папка уже существует, она не будет перезаписана или заменена. Он просто вернет существующий объект папки. Однако если вы используете New-Item -Force в файле, который уже существует, файл перезаписывается.

Удаление всех файлов и папок в папке

Вы можете удалить содержащиеся элементы с помощью Remove-Item, но вам будет предложено подтвердить удаление, если элемент содержит что-либо другое. Например, если вы пытаетесь удалить папку C:\temp\DeleteMe, которая содержит другие элементы, PowerShell запрашивает подтверждение перед удалением папки:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Если вы не хотите, чтобы вас запрашивали по каждому содержащемуся элементу, укажите параметр Recurse.

Remove-Item -Path C:\temp\DeleteMe -Recurse

Сопоставление локальной папки как диска

Вы также можете связать локальную папку с помощью команды New-PSDrive. Следующая команда создает локальный диск P: с корнем в местном каталоге Program Files, который виден только в сеансе PowerShell.

New-PSDrive -Name P -Root $Env:ProgramFiles -PSProvider FileSystem

Как и при использовании сетевых дисков, диски, сопоставленные в PowerShell, сразу же видны оболочке PowerShell. Чтобы создать сопоставленный диск, видимый из проводника, используйте параметр Сохранить. Однако с Persistможно использовать только удаленные пути.

Чтение текстового файла в массив

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

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

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

PS> (Get-Content -Path $PROFILE).Length
3

Эта команда наиболее полезна для получения списков сведений в PowerShell. Например, можно сохранить список имен компьютеров или IP-адресов в файле C:\temp\domainMembers.txtс одним именем в каждой строке файла. Вы можете использовать Get-Content для получения содержимого файла и их вставки в переменную $Computers:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers теперь представляет собой массив, содержащий имя компьютера в каждом элементе.