Работа с файлами и папками
Навигация по дискам 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:\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
Внимание
При использовании параметра 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
представляет собой массив, содержащий в каждом элементе имя компьютера.
PowerShell