4. Файлы в PowerShell
Работа с файлами и директориями
Заголовок раздела «Работа с файлами и директориями»PowerShell предоставляет богатый набор команд (cmdlets) для работы с файловой системой. Все они работают с объектами, что даёт дополнительные возможности по сравнению с CMD.
Get-ChildItem — список файлов
Заголовок раздела «Get-ChildItem — список файлов»Get-ChildItem # текущая директорияGet-ChildItem C:\Users # конкретная директорияGet-ChildItem -Path C:\Windows # через параметр PathGet-ChildItem *.txt # только .txt файлыGet-ChildItem -Recurse # рекурсивноGet-ChildItem -Filter "*.log" # фильтрGet-ChildItem -Hidden # скрытые файлыGet-ChildItem -Force # все файлы включая скрытыеGet-ChildItem -Directory # только директорииGet-ChildItem -File # только файлыGet-ChildItem -Recurse -Filter "*.js" # все .js файлы рекурсивно
# СокращенияlsdirgciGet-Item — информация о файле
Заголовок раздела «Get-Item — информация о файле»Get-Item C:\Windows\System32\notepad.exeGet-Item . # текущая директория
# Свойства объекта$file = Get-Item "file.txt"$file.Name # имя файла$file.FullName # полный путь$file.Length # размер в байтах$file.LastWriteTime # время изменения$file.Extension # расширение (.txt)$file.Directory # родительская директория$file.IsReadOnly # только для чтения?New-Item — создание файлов и директорий
Заголовок раздела «New-Item — создание файлов и директорий»# Создать файлNew-Item -Path "file.txt" -ItemType FileNew-Item "newfile.txt" -ItemType FileNew-Item "newfile.txt" -ItemType File -Value "Содержимое файла"
# Создать директориюNew-Item -Path "MyFolder" -ItemType DirectoryNew-Item "MyFolder" -ItemType Directorymkdir MyFolder # тоже работает
# Создать структуру директорийNew-Item -Path "Project\src\components" -ItemType Directory -Force# -Force создаёт родительские директории если нужно
# Создать несколько файлов"file1.txt", "file2.txt" | ForEach-Object { New-Item $_ -ItemType File }Remove-Item — удаление
Заголовок раздела «Remove-Item — удаление»Remove-Item file.txt # удалить файлRemove-Item -Path file.txt # через параметрRemove-Item *.tmp # все .tmp файлыRemove-Item folder -Recurse # директорию с содержимымRemove-Item -Path folder -Recurse -Force # принудительноRemove-Item file.txt -WhatIf # что будет удалено (без удаления!)Remove-Item file.txt -Confirm # с подтверждением
# Удалить несколькоRemove-Item file1.txt, file2.txt, file3.txt
# Рекурсивно удалить определённые файлыGet-ChildItem -Recurse -Filter "*.log" | Remove-ItemCopy-Item — копирование
Заголовок раздела «Copy-Item — копирование»Copy-Item file.txt backup.txt # скопировать файлCopy-Item file.txt C:\Backup\ # в другую директориюCopy-Item -Path src -Destination dst -Recurse # директорию рекурсивноCopy-Item *.txt C:\TextFiles\ # скопировать по маскеCopy-Item file.txt -Destination backup.txt -Force # перезаписать
# Копировать с фильтромGet-ChildItem -Recurse -Filter "*.js" | Copy-Item -Destination C:\Backup\Move-Item — перемещение и переименование
Заголовок раздела «Move-Item — перемещение и переименование»Move-Item old.txt new.txt # переименоватьMove-Item file.txt C:\NewLocation\ # переместитьMove-Item -Path *.log -Destination C:\Logs\ # переместить по маскеMove-Item folder1 folder2 # переименовать директориюGet-Content — чтение файлов
Заголовок раздела «Get-Content — чтение файлов»Get-Content file.txt # всё содержимоеGet-Content file.txt -TotalCount 10 # первые 10 строкGet-Content file.txt -Tail 20 # последние 20 строкGet-Content file.txt -Wait # следить (как tail -f)
# Читать как массив строк$lines = Get-Content file.txt$lines.Count # количество строк$lines[0] # первая строка$lines[-1] # последняя строка
# Читать как JSON$config = Get-Content config.json | ConvertFrom-Json$config.server.port
# Краткая формаcat file.txtgc file.txtSet-Content и Add-Content — запись файлов
Заголовок раздела «Set-Content и Add-Content — запись файлов»# Записать в файл (перезаписать)Set-Content file.txt "Привет, мир!""Line 1", "Line 2", "Line 3" | Set-Content file.txt
# Добавить в конец файлаAdd-Content file.txt "Новая строка""Another line" | Add-Content log.txt
# Записать объекты как CSVGet-Process | Export-Csv processes.csv -NoTypeInformationGet-Service | Export-Csv services.csv
# Читать CSV обратно$data = Import-Csv processes.csvРабота с путями
Заголовок раздела «Работа с путями»# Объединить путиJoin-Path "C:\Users" "username\Documents" # C:\Users\username\DocumentsJoin-Path $env:USERPROFILE "Desktop\file.txt"
# Разобрать путьSplit-Path "C:\Users\user\file.txt" # C:\Users\userSplit-Path "C:\Users\user\file.txt" -Leaf # file.txtSplit-Path "C:\Users\user\file.txt" -Parent # C:\Users\user
# Проверить существованиеTest-Path "C:\Windows" # TrueTest-Path "C:\NonExistent" # FalseTest-Path "C:\Windows" -PathType Container # DirectoryTest-Path "C:\Windows\notepad.exe" -PathType Leaf # File
# Полный путьResolve-Path ".\relative\path"[System.IO.Path]::GetFullPath("relative\path")Практика
Заголовок раздела «Практика»# 1. Создай структуру проекта$projectPath = "$env:USERPROFILE\Desktop\PSProject"New-Item -Path $projectPath -ItemType Directory -ForceNew-Item -Path "$projectPath\src" -ItemType DirectoryNew-Item -Path "$projectPath\tests" -ItemType DirectoryNew-Item -Path "$projectPath\src\main.ps1" -ItemType FileNew-Item -Path "$projectPath\README.md" -ItemType File -Value "# My PowerShell Project"
# 2. Посмотри результатGet-ChildItem $projectPath -Recurse
# 3. Запиши в файл"function Main {" | Set-Content "$projectPath\src\main.ps1"" Write-Output 'Hello, World!'" | Add-Content "$projectPath\src\main.ps1""}" | Add-Content "$projectPath\src\main.ps1"
# 4. Прочитай файлGet-Content "$projectPath\src\main.ps1"
# 5. Найди все файлы > 0 байтGet-ChildItem $projectPath -Recurse | Where-Object { $_.Length -gt 0 }
# 6. Убери за собойRemove-Item $projectPath -Recurse -ForcePowerShell делает работу с файловой системой мощной и гибкой. Объектная модель позволяет легко фильтровать и обрабатывать файлы!