Лабораторная работа №4. Работа с файлами и папками.
PowerShell унаследовал все старые команды и снабдил замечательной справочной системой.
В консоли PowerShell введите команду dir, нажмите Enter, затем Get-ChildItem D:\Script и снова Enter, посмотрите на результаты. Они одинаковы. Потому что dir является алиасом к Get-Children.
Как дополнительный пример можно привести аналог для dir /S которая рекурсивно выводит список файлов.
Get-ChildItem -Force D:\Script -Recurse
На замену dir *.exe пришла возможность фильтрации элементов при помощи параметров Path, Filter, Include и Exclude.
Добавилась сложная фильтрация элементов при помощи командлета WhereObject (сокращенное написание Where).
Простой пример фильтрации по расширению.
Get-ChildItem -Path C:\Windows | Where {$_.extension -eq ".dll"}
PowerShell использует в качестве подстановочных знаков не только ? и * как это было в cmd.exe, но и группы символов в квадратных скобках.
Поэтому если попробуете найти файл Script[01].ps1 командой
Get-ChildItem ‘.\Script[01].ps1′ То получите ошибку.
В этом случае необходимо использовать параметр -LitealPath
Get-ChildItem -LiteralPath ‘.\Script[01].ps1′
Более сложный вариант выполнит поиск архивов в папке D:\Backup, созданных после 1 мая 2011 года, размер которых находится в диапазоне 10-100 Мб.
Get-ChildItem -Path D:\Backup -Recurse -Include *.zip | Where-Object -FilterScript {($_.LastWriteTime -gt "2011-05-01") -and ($_.Length -ge 10mb) -and ($_.Length -le 100mb)}
Опции Include и Exclude работают соответственно своим названиям т.е. первая включает а вторая исключает заданный фильтр из поиска.
$exclude = @(‘*.dll’,‘*.exe’)
$include = @(‘*.txt’,‘*.ps1′)
$result1 = Get-ChildItem "C:\Script" -Recurse -Exclude $exclude
$result2 = Get-ChildItem "D:\Script" -Recurse -Include $include
Копирование файлов.
Аналогом команды copy стал командлет Copy-Item.
Copy-Item -Path D:\Script\script—01.ps1 -Destination E:\Backup\27—09— 2011\script—01.ps1
В случае если целевой файл уже существует, при попытке его скопировать, получите ошибку. Для перезаписи целевого файла используется параметр Force:
Copy-Item -Path D:\Script\script—01.ps1 -Destination E:\Backup\27—09—
2011\script—01.ps1 -Force
Ключ Force работает даже когда целевой файл помечен как файл только для чтения.
Копирование дерева папок выполняется той же командой, но с указанием ключа Recurse.
Copy-Item -Path D:\Script -Recurse E:\Backup\27—09—2011
При необходимости копирования определѐнных объектов, например только скриптов PowerShell-а вы можете задать фильтр.
Copy-Item —Filter *.txt -Path D:\Script -Recurse E:\Backup\27—09—2011
Создание файлов и папок средствами PowerShell производится с помощью командлета New-Item.
Для создания папки придется указать тип элемента «Directory», а для создания файла «File»
New-Item -Path ‘D:\Script\New Folder’ -ItemType "directory"
New-Item -Path ‘D:\Script\New Folder\script-02.ps1′ -ItemType "file"
Старая команда mkdir, позволяющая создавать папки получила новую жизнь в виде алиаса md.
Переименование элементов производится с помощью команды Rename-Item.
Rename-Item .\File—01.ps1 .\File—01.ps1.bak
Удаление производится с помощью Remove-Item.
Удалить вложенные в папку элементы можно при помощи командлета RemoveItem, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. К примеру, в случае если мы пытаемся удалить папку d:\Backup\20-092011, содержащую другие элементы, PowerShell предложит подтвердить свои действия.
Remove-Item d:\Backup\20—09—2011 -Recurse
Практическое применение всего вышесказанного может быть разнообразно.
Например, может быть задача поиска в лог файлах определѐнного выражения по маске ip-адреса «192.168.100.253» с последующим копированием найденного в папку
D:\TEMP, вариантов множество, вот метод поиска:
$current = Get-Date
$Days = "-30"
$start = $current.AddDays($days)
Get-ChildItem D:\Logs —Filter *.log -Recurse | Where-Object {($_.LastWriteTime.Date -ge $Start.Date) -and ($_.LastWriteTime.Date -le $End.Date)} | Select-String "192.168.100.253" | Copy-Item -Destination D:\TEMP
Можно придумать сценарий, когда требуется из определѐнной папки удалять все файлы и папки старше 30 дней.
$Path = "C:\temp"
$Days = "-30"
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
Или если вам требуется удалять все что есть в папке и в подпапках:
$Path = "C:\temp"
$Days = "-30"
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path -Recurse | Where-Object { $_.LastWriteTime -lt $OldDate } |
Remove-Item
© ООО «Знанио»
С вами с 2009 года.