Windows PowerShellでは、ファイル操作をコマンドで効率的に行うことができます。
エクスプローラーでは時間がかかる大量の処理や、定期的なバックアップ、ログ整理なども一行のコマンドで自動化できます。
この記事では、初心者でもすぐに使えるPowerShellのファイル操作コマンドを一覧形式でわかりやすくまとめました。
実例つきで紹介するので、日常業務やスクリプト作成にもすぐに活かせます!
PowerShellの基本的なファイル操作の考え方

コマンドレットの基本構造
PowerShellのコマンドは「動詞-名詞」の形で構成されています:
Get-ChildItem # Get(取得)- ChildItem(子項目)
Copy-Item # Copy(コピー)- Item(項目)
Remove-Item # Remove(削除)- Item(項目)
エイリアス(短縮形)について
多くのコマンドには短いエイリアスが用意されています:
Get-ChildItem → gci, ls, dir
Copy-Item → cp, copy
Move-Item → mv, move
Remove-Item → rm, del
パスの指定方法
# 絶対パス
C:\Users\UserName\Documents\file.txt
# 相対パス
.\file.txt # 現在のディレクトリ
..\parent\file.txt # 親ディレクトリ
# PowerShellの特殊なパス表記
$env:USERPROFILE\Documents\file.txt # ユーザーフォルダ
ファイルの確認・一覧表示
Get-ChildItem(ファイル・フォルダー一覧)
コマンド | 説明 | 実行例 |
---|---|---|
Get-ChildItem | 現在のディレクトリの内容を表示 | Get-ChildItem |
Get-ChildItem パス | 指定したディレクトリの内容を表示 | Get-ChildItem C:\Logs |
Get-ChildItem -File | ファイルのみを表示 | Get-ChildItem C:\Data -File |
Get-ChildItem -Directory | フォルダーのみを表示 | Get-ChildItem C:\Data -Directory |
Get-ChildItem -Recurse | サブフォルダーも含めて再帰的に表示 | Get-ChildItem C:\Data -Recurse |
実用例
# 拡張子でフィルタリング
Get-ChildItem C:\Logs -Filter "*.log"
# 複数の拡張子でフィルタリング
Get-ChildItem C:\Data -Include "*.txt","*.csv" -Recurse
# 除外フィルタ
Get-ChildItem C:\Temp -Exclude "*.tmp"
# サイズでフィルタリング(10MB以上のファイル)
Get-ChildItem C:\Data -File | Where-Object {$_.Length -gt 10MB}
# 日付でフィルタリング(1週間以内に更新されたファイル)
Get-ChildItem C:\Logs -File | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-7)}
Test-Path(存在確認)
# ファイルの存在確認
Test-Path C:\Data\report.csv
# 結果: True または False
# フォルダーの存在確認
Test-Path C:\Backup
# 結果: True または False
# 条件分岐での使用例
if (Test-Path C:\Data\config.ini) {
Write-Host "設定ファイルが見つかりました"
} else {
Write-Host "設定ファイルが存在しません"
}
Get-Item(詳細情報取得)
# ファイルの詳細情報を取得
Get-Item C:\Data\test.txt
# 複数ファイルの情報を取得
Get-Item C:\Data\*.txt
# 特定のプロパティのみを表示
Get-Item C:\Data\test.txt | Select-Object Name, Length, LastWriteTime
ファイルの作成・書き込み

New-Item(新規作成)
用途 | コマンド例 |
---|---|
空のファイル作成 | New-Item -Path C:\Test\sample.txt -ItemType File |
フォルダー作成 | New-Item -Path C:\Test\NewFolder -ItemType Directory |
内容付きファイル作成 | New-Item -Path C:\Test\data.txt -ItemType File -Value "初期内容" |
実用例
# 階層フォルダーを一度に作成
New-Item -Path C:\Project\Source\Scripts -ItemType Directory -Force
# 複数ファイルを一度に作成
"file1.txt","file2.txt","file3.txt" | ForEach-Object {
New-Item -Path "C:\Test\$_" -ItemType File
}
# テンプレートファイルの作成
$template = @"
# 設定ファイル
Server=localhost
Port=3306
Database=mydb
"@
New-Item -Path C:\Config\database.ini -ItemType File -Value $template
ファイルへの書き込み
Set-Content(上書き)
# 文字列をファイルに書き込み
Set-Content -Path C:\Test\log.txt -Value "新しいログエントリ"
# 複数行を書き込み
$content = @(
"行1",
"行2",
"行3"
)
Set-Content -Path C:\Test\multiline.txt -Value $content
# エンコーディングを指定
Set-Content -Path C:\Test\utf8.txt -Value "日本語テキスト" -Encoding UTF8
Add-Content(追記)
# ファイルに追記
Add-Content -Path C:\Test\log.txt -Value "追加のログエントリ"
# 日時付きでログ追記
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path C:\Logs\application.log -Value "$timestamp: 処理完了"
# 複数行を追記
$newEntries = @(
"エントリ1",
"エントリ2"
)
Add-Content -Path C:\Test\log.txt -Value $newEntries
Out-File(出力リダイレクト)
# 出力をファイルに保存
"Hello World" | Out-File -FilePath C:\Test\output.txt
# コマンドの結果をファイルに保存
Get-Process | Out-File -FilePath C:\Logs\processes.txt
# 追記モード
Get-Date | Out-File -FilePath C:\Logs\timestamps.txt -Append
ファイルのコピー・移動・名前変更
Copy-Item(コピー)
用途 | コマンド例 |
---|---|
ファイルコピー | Copy-Item C:\Source\file.txt -Destination C:\Dest\ |
名前を変えてコピー | Copy-Item C:\Source\file.txt -Destination C:\Dest\newname.txt |
フォルダー全体をコピー | Copy-Item C:\Source\ -Destination C:\Dest\ -Recurse |
強制上書き | Copy-Item C:\Source\file.txt -Destination C:\Dest\ -Force |
実用例
# 特定の拡張子のファイルをすべてコピー
Get-ChildItem C:\Source -Filter "*.jpg" | Copy-Item -Destination C:\Pictures\
# 日付フォルダーを作成してバックアップ
$backupFolder = "C:\Backup\$(Get-Date -Format 'yyyy-MM-dd')"
New-Item -Path $backupFolder -ItemType Directory -Force
Copy-Item C:\Important\* -Destination $backupFolder -Recurse
# 条件付きコピー(更新されたファイルのみ)
Get-ChildItem C:\Source -File | Where-Object {
$_.LastWriteTime -gt (Get-Date).AddDays(-1)
} | Copy-Item -Destination C:\Recent\
Move-Item(移動・名前変更)
# ファイル移動
Move-Item C:\Temp\file.txt -Destination C:\Archive\
# ファイル名変更
Move-Item C:\Data\oldname.txt -Destination C:\Data\newname.txt
# フォルダー移動
Move-Item C:\OldProject -Destination C:\Archive\
# 強制移動(上書き)
Move-Item C:\Source\file.txt -Destination C:\Dest\file.txt -Force
Rename-Item(名前変更)
# ファイル名変更
Rename-Item C:\Data\report.txt -NewName "report_2024.txt"
# 拡張子変更
Rename-Item C:\Data\data.txt -NewName "data.csv"
# 一括リネーム例
Get-ChildItem C:\Photos -Filter "*.jpg" | ForEach-Object {
$newName = "Photo_$(Get-Date -Format 'yyyyMMdd')_$($_.Name)"
Rename-Item $_.FullName -NewName $newName
}
ファイルの削除・クリーンアップ

Remove-Item(削除)
用途 | コマンド例 |
---|---|
ファイル削除 | Remove-Item C:\Temp\file.txt |
フォルダー削除 | Remove-Item C:\OldData -Recurse |
強制削除 | Remove-Item C:\Temp\file.txt -Force |
確認なしで削除 | Remove-Item C:\Temp\*.tmp -Confirm:$false |
実用例
# 古いログファイルを削除(30日以上前)
Get-ChildItem C:\Logs -Filter "*.log" | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-30)
} | Remove-Item
# 一時ファイルをクリーンアップ
Remove-Item C:\Temp\*.tmp, C:\Temp\*.temp -Force
# 空のフォルダーを削除
Get-ChildItem C:\Data -Directory | Where-Object {
(Get-ChildItem $_.FullName -Force | Measure-Object).Count -eq 0
} | Remove-Item
# サイズが0のファイルを削除
Get-ChildItem C:\Data -File | Where-Object {$_.Length -eq 0} | Remove-Item
Clear-Content(内容だけ削除)
# ファイルの中身を空にする
Clear-Content C:\Logs\debug.log
# 複数ファイルの内容をクリア
Clear-Content C:\Logs\*.log
# 大きなログファイルをクリア(ファイルは残す)
Get-ChildItem C:\Logs -Filter "*.log" | Where-Object {
$_.Length -gt 100MB
} | Clear-Content
高度なファイル操作テクニック
ファイル内容の読み取り
# ファイル全体を読み込み
Get-Content C:\Data\config.txt
# 最後の10行を表示
Get-Content C:\Logs\app.log -Tail 10
# ファイルの変更を監視
Get-Content C:\Logs\app.log -Wait -Tail 0
# CSVファイルとして読み込み
Import-Csv C:\Data\users.csv
# JSONファイルとして読み込み
Get-Content C:\Config\settings.json | ConvertFrom-Json
ファイル検索とフィルタリング
# ファイル名で検索
Get-ChildItem C:\\ -Name "*report*" -Recurse
# 内容で検索
Get-ChildItem C:\Scripts -Filter "*.ps1" | Select-String "function"
# 重複ファイルの検出
Get-ChildItem C:\Data -File | Group-Object Name | Where-Object {$_.Count -gt 1}
# 最大・最小ファイルの検索
Get-ChildItem C:\Data -File | Sort-Object Length | Select-Object -First 1 # 最小
Get-ChildItem C:\Data -File | Sort-Object Length -Descending | Select-Object -First 1 # 最大
実用的なスクリプト例

自動バックアップスクリプト
# 日次バックアップスクリプト
param(
[string]$SourcePath = "C:\Important",
[string]$BackupRoot = "C:\Backup"
)
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$backupPath = Join-Path $BackupRoot "Backup_$timestamp"
try {
Write-Host "バックアップを開始します..."
New-Item -Path $backupPath -ItemType Directory -Force
Copy-Item "$SourcePath\*" -Destination $backupPath -Recurse -Force
Write-Host "バックアップが完了しました: $backupPath"
# 7日以上古いバックアップを削除
Get-ChildItem $BackupRoot -Directory | Where-Object {
$_.Name -like "Backup_*" -and $_.CreationTime -lt (Get-Date).AddDays(-7)
} | Remove-Item -Recurse -Force
} catch {
Write-Error "バックアップに失敗しました: $($_.Exception.Message)"
}
ログファイル管理スクリプト
# ログローテーションスクリプト
param(
[string]$LogPath = "C:\Logs",
[int]$MaxAgeDays = 30,
[long]$MaxSizeMB = 100
)
Write-Host "ログファイルの管理を開始します..."
# 古いログファイルを削除
$oldLogs = Get-ChildItem $LogPath -Filter "*.log" | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-$MaxAgeDays)
}
foreach ($log in $oldLogs) {
Write-Host "古いログファイルを削除: $($log.Name)"
Remove-Item $log.FullName -Force
}
# 大きなログファイルをアーカイブ
$largeLogs = Get-ChildItem $LogPath -Filter "*.log" | Where-Object {
$_.Length -gt ($MaxSizeMB * 1MB)
}
foreach ($log in $largeLogs) {
$archiveName = "$($log.BaseName)_$(Get-Date -Format 'yyyyMMdd').log"
$archivePath = Join-Path (Join-Path $LogPath "Archive") $archiveName
Write-Host "大きなログファイルをアーカイブ: $($log.Name)"
New-Item -Path (Split-Path $archivePath) -ItemType Directory -Force
Move-Item $log.FullName -Destination $archivePath
New-Item -Path $log.FullName -ItemType File
}
Write-Host "ログファイル管理が完了しました"
ファイル整理スクリプト
# ダウンロードフォルダー整理スクリプト
$downloadPath = "$env:USERPROFILE\Downloads"
$organizePath = "$env:USERPROFILE\Documents\Organized"
# 拡張子別フォルダーマッピング
$folderMap = @{
'.pdf' = 'PDFs'
'.doc' = 'Documents'
'.docx' = 'Documents'
'.xls' = 'Spreadsheets'
'.xlsx' = 'Spreadsheets'
'.jpg' = 'Images'
'.jpeg' = 'Images'
'.png' = 'Images'
'.mp4' = 'Videos'
'.zip' = 'Archives'
'.rar' = 'Archives'
}
Get-ChildItem $downloadPath -File | ForEach-Object {
$extension = $_.Extension.ToLower()
if ($folderMap.ContainsKey($extension)) {
$targetFolder = Join-Path $organizePath $folderMap[$extension]
New-Item -Path $targetFolder -ItemType Directory -Force
$targetPath = Join-Path $targetFolder $_.Name
if (-not (Test-Path $targetPath)) {
Move-Item $_.FullName -Destination $targetPath
Write-Host "移動: $($_.Name) → $($folderMap[$extension])"
}
}
}
エラーハンドリングとベストプラクティス
エラーハンドリング
# try-catch を使用したエラーハンドリング
try {
Copy-Item C:\Source\file.txt -Destination C:\Dest\ -ErrorAction Stop
Write-Host "コピーが成功しました"
} catch {
Write-Error "コピーに失敗しました: $($_.Exception.Message)"
}
# エラーアクション設定
Copy-Item C:\Source\*.txt -Destination C:\Dest\ -ErrorAction SilentlyContinue
# 操作前の確認
if (Test-Path C:\Important\data.txt) {
Remove-Item C:\Important\data.txt -Confirm
}
パフォーマンスの向上
# パイプラインを効率的に使用
Get-ChildItem C:\Data -Filter "*.txt" |
Where-Object {$_.Length -gt 1MB} |
Copy-Item -Destination C:\Large\
# 並列処理の活用(PowerShell 7以降)
Get-ChildItem C:\Data -File | ForEach-Object -Parallel {
Copy-Item $_.FullName -Destination "C:\Backup\$($_.Name)"
} -ThrottleLimit 5
よくある質問と答え
Q: PowerShellとコマンドプロンプトのコマンドの違いは?
A: PowerShellはオブジェクト指向で、より強力なフィルタリングや操作が可能です。cmdコマンドも多くが使用できます。
Q: 大量のファイルを処理するときの注意点は?
A: -WhatIf
パラメーターでテスト実行してから本実行し、適切なエラーハンドリングを実装してください。
Q: パスにスペースが含まれる場合はどうしますか?
A: パス全体を引用符で囲むか、PowerShellの自動補完機能を活用してください。
まとめ:PowerShellでWindowsのファイル操作をマスターしよう!
重要ポイントまとめ:
- PowerShellはGUI操作では難しい大量ファイル処理に最適
- コマンドレットの組み合わせで複雑な操作も自動化可能
- エラーハンドリングとテスト実行で安全に操作
- スクリプト化すれば繰り返し作業を効率化
PowerShellはGUI操作では難しい大量のファイル処理や定期的な作業を効率化するのに最適なツールです。
今回紹介したコマンドを組み合わせれば、バックアップ・整理・監視・ログ管理などがわずか数行で自動化できます。
基本的な特徴:
- 初心者でも使えるコマンド構文
- 応用も効く実用例
- スクリプト化すれば再利用も簡単
コメント