【保存版】Windows PowerShell ファイル操作コマンド一覧|コピー・移動・削除など基本操作を完全網羅!

Windows

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操作では難しい大量のファイル処理や定期的な作業を効率化するのに最適なツールです。

今回紹介したコマンドを組み合わせれば、バックアップ・整理・監視・ログ管理などがわずか数行で自動化できます。

基本的な特徴:

  • 初心者でも使えるコマンド構文
  • 応用も効く実用例
  • スクリプト化すれば再利用も簡単

コメント

タイトルとURLをコピーしました