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

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

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

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

Get-ChildItem -Path C:\ -Force

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

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

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Вы можете выполнять сложную фильтрацию на основе других свойств элементов с помощью 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:\dataC:\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

Внимание

При использовании параметра Force с командой 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. Чтобы создать сопоставленный диск, видимый из проводник, используйте параметр "Сохранить". Однако с сохранением можно использовать только удаленные пути.

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

Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. Командлет 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 обрабатывает данные, считанные из файла как массив, с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:

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 представляет собой массив, содержащий в каждом элементе имя компьютера.