Перейти к содержимому

4. Файлы в PowerShell

PowerShell предоставляет богатый набор команд (cmdlets) для работы с файловой системой. Все они работают с объектами, что даёт дополнительные возможности по сравнению с CMD.

Окно терминала
Get-ChildItem # текущая директория
Get-ChildItem C:\Users # конкретная директория
Get-ChildItem -Path C:\Windows # через параметр Path
Get-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 файлы рекурсивно
# Сокращения
ls
dir
gci
Окно терминала
Get-Item C:\Windows\System32\notepad.exe
Get-Item . # текущая директория
# Свойства объекта
$file = Get-Item "file.txt"
$file.Name # имя файла
$file.FullName # полный путь
$file.Length # размер в байтах
$file.LastWriteTime # время изменения
$file.Extension # расширение (.txt)
$file.Directory # родительская директория
$file.IsReadOnly # только для чтения?
Окно терминала
# Создать файл
New-Item -Path "file.txt" -ItemType File
New-Item "newfile.txt" -ItemType File
New-Item "newfile.txt" -ItemType File -Value "Содержимое файла"
# Создать директорию
New-Item -Path "MyFolder" -ItemType Directory
New-Item "MyFolder" -ItemType Directory
mkdir MyFolder # тоже работает
# Создать структуру директорий
New-Item -Path "Project\src\components" -ItemType Directory -Force
# -Force создаёт родительские директории если нужно
# Создать несколько файлов
"file1.txt", "file2.txt" | ForEach-Object { New-Item $_ -ItemType File }
Окно терминала
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-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 old.txt new.txt # переименовать
Move-Item file.txt C:\NewLocation\ # переместить
Move-Item -Path *.log -Destination C:\Logs\ # переместить по маске
Move-Item folder1 folder2 # переименовать директорию
Окно терминала
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.txt
gc file.txt
Окно терминала
# Записать в файл (перезаписать)
Set-Content file.txt "Привет, мир!"
"Line 1", "Line 2", "Line 3" | Set-Content file.txt
# Добавить в конец файла
Add-Content file.txt "Новая строка"
"Another line" | Add-Content log.txt
# Записать объекты как CSV
Get-Process | Export-Csv processes.csv -NoTypeInformation
Get-Service | Export-Csv services.csv
# Читать CSV обратно
$data = Import-Csv processes.csv
Окно терминала
# Объединить пути
Join-Path "C:\Users" "username\Documents" # C:\Users\username\Documents
Join-Path $env:USERPROFILE "Desktop\file.txt"
# Разобрать путь
Split-Path "C:\Users\user\file.txt" # C:\Users\user
Split-Path "C:\Users\user\file.txt" -Leaf # file.txt
Split-Path "C:\Users\user\file.txt" -Parent # C:\Users\user
# Проверить существование
Test-Path "C:\Windows" # True
Test-Path "C:\NonExistent" # False
Test-Path "C:\Windows" -PathType Container # Directory
Test-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 -Force
New-Item -Path "$projectPath\src" -ItemType Directory
New-Item -Path "$projectPath\tests" -ItemType Directory
New-Item -Path "$projectPath\src\main.ps1" -ItemType File
New-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 -Force

PowerShell делает работу с файловой системой мощной и гибкой. Объектная модель позволяет легко фильтровать и обрабатывать файлы!