PowerShellコマンドの基本 ── まず覚える操作と安全な使い方
1. 最初に押さえるべきこと
PowerShell は、Windows の設定確認、ファイル整理、ログ調査、CSV 加工、サービス操作、定型作業の自動化に使えるコマンド環境です。
ただし、最初から複雑なスクリプトを書く必要はありません。まずは次の流れだけ覚えると、実務でかなり使えるようになります。
探す → 見る → 絞る → 並べる → 出力する → 必要なら変更する
PowerShell の基本は「長いコマンドを暗記すること」ではありません。
重要なのは、次の3つです。
Get-CommandとGet-Helpでコマンドを調べられること|パイプラインで結果を次のコマンドへ渡せること- 削除・停止・変更の前に
-WhatIfや-Confirmで影響を確認すること
PowerShell は「調査」と「変更」を同じ画面で実行できます。便利な反面、削除や停止もすぐ実行できるため、読み取り専用の確認から始める癖が重要です。
2. PowerShell とコマンドプロンプトの違い
PowerShell は、従来のコマンドプロンプト(cmd.exe)と似て見えますが、内部の考え方が違います。
| 観点 | コマンドプロンプト | PowerShell |
|---|---|---|
| 主な出力 | 文字列 | オブジェクト |
| コマンド名 | dir、copy など |
Get-ChildItem、Copy-Item など |
| 結果の加工 | 文字列処理が中心 | プロパティを使って絞り込み・並べ替え |
| 自動化 | バッチファイル | .ps1 スクリプト |
| 得意分野 | 古いコマンド資産との互換 | Windows 管理、CSV、JSON、API、定型作業 |
たとえば、ファイル一覧を取得する場合、cmd.exe では dir の表示結果を文字列として眺めることが多くなります。
PowerShell では、ファイルが Name、Length、LastWriteTime などのプロパティを持つオブジェクトとして扱われます。
Get-ChildItem
この違いが分かると、次のように「7日以内に更新されたファイルだけを、更新日時の新しい順に表示する」といった処理が自然に書けます。
Get-ChildItem -File |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } |
Sort-Object LastWriteTime -Descending |
Select-Object Name, Length, LastWriteTime
3. Windows PowerShell 5.1 と PowerShell 7.x
Windows には、昔から入っている Windows PowerShell 5.1 と、新しい系統の PowerShell 7.x があります。
実務では、次のように考えると分かりやすいです。
| 種類 | 実行ファイル | 主な用途 |
|---|---|---|
| Windows PowerShell 5.1 | powershell.exe |
古い Windows 専用モジュール、既存スクリプト、社内資産の保守 |
| PowerShell 7.x | pwsh.exe |
新規スクリプト、クロスプラットフォーム、継続的な機能改善 |
新しく学ぶ場合は PowerShell 7.x を基準にして問題ありません。ただし、社内の古い管理スクリプトや Windows 固有のモジュールは、Windows PowerShell 5.1 前提で作られていることがあります。
そのため、実務では最初にバージョンを確認します。
$PSVersionTable
特定バージョン以上で動かしたいスクリプトには、先頭に条件を書いておくと事故を減らせます。
#Requires -Version 7.0
4. コマンドレットの名前は Verb-Noun
PowerShell の標準コマンドは、基本的に 動詞-名詞 の形です。
Get-Process
Get-Service
Get-ChildItem
Copy-Item
Remove-Item
Export-Csv
この形を覚えると、未知のコマンドも探しやすくなります。
| 動詞 | 意味 | 例 |
|---|---|---|
Get |
取得する | Get-Process |
Set |
設定する | Set-Location |
New |
作成する | New-Item |
Copy |
コピーする | Copy-Item |
Move |
移動する | Move-Item |
Remove |
削除する | Remove-Item |
Start |
開始する | Start-Service |
Stop |
停止する | Stop-Process |
Import |
読み込む | Import-Csv |
Export |
書き出す | Export-Csv |
dir、ls、cat、cd のような短い名前も使えますが、多くはエイリアスです。
Get-Command dir
スクリプトとして残す場合は、エイリアスではなく正式名を使う方が安全です。
# 読めるが、スクリプトでは避けたい
ls *.log
# 意図が明確
Get-ChildItem -Filter *.log
5. まず覚える3つの調査コマンド
PowerShell はコマンドの数が多いため、暗記よりも「調べ方」を覚える方が実務的です。
1. Get-Command ── 使えるコマンドを探す
Get-Command は、インストールされているコマンド、関数、エイリアス、アプリケーションを探すためのコマンドです。
# Process という名詞を持つコマンドを探す
Get-Command -Noun Process
# Service 関連のコマンドを探す
Get-Command *Service*
# CSV 関連のコマンドを探す
Get-Command *Csv*
コマンド名がうろ覚えのときは、ワイルドカードを使います。
Get-Command *Item*
Get-Command *Content*
Get-Command *Json*
2. Get-Help ── 使い方を見る
Get-Help は、コマンドの説明、パラメーター、例を確認するためのコマンドです。
Get-Help Get-ChildItem
Get-Help Get-ChildItem -Examples
Get-Help Get-ChildItem -Full
Get-Help Get-ChildItem -Online
最初は -Examples が便利です。
Get-Help Where-Object -Examples
ヘルプが古い、または不足している場合は、管理者権限の PowerShell でヘルプを更新します。
Update-Help
環境によってはインターネット接続や権限が必要です。会社 PC では、プロキシや管理ポリシーにより失敗することもあります。
3. Get-Member ── オブジェクトの中身を見る
PowerShell の出力は、多くの場合「文字列」ではなく「オブジェクト」です。
Get-Member を使うと、そのオブジェクトがどのようなプロパティやメソッドを持っているか確認できます。
Get-Process | Get-Member
Get-Service | Get-Member
Get-ChildItem | Get-Member
たとえば、サービスには Status や Name などのプロパティがあります。
Get-Service | Select-Object Name, Status
ファイルには Name、Length、LastWriteTime などがあります。
Get-ChildItem -File | Select-Object Name, Length, LastWriteTime
「何で絞ればよいか分からない」ときは、まず
Get-Memberでプロパティ名を確認します。
6. パイプラインの基本
PowerShell の | は、左のコマンドの結果を右のコマンドへ渡します。
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
この例は、次の処理を左から右へ行います。
プロセス一覧を取得
→ CPU 使用量で降順に並べる
→ 上位10件だけ表示
よく使う組み合わせは次の通りです。
| コマンド | 役割 | 例 |
|---|---|---|
Where-Object |
条件で絞る | 停止中のサービスだけ取得 |
Sort-Object |
並べる | 更新日時の新しい順に並べる |
Select-Object |
列や件数を選ぶ | 名前とサイズだけ表示 |
ForEach-Object |
各要素に処理する | ファイルごとに処理する |
Export-Csv |
CSV に出力する | 調査結果を保存する |
Where-Object ── 条件で絞る
# 停止中のサービスだけ表示
Get-Service | Where-Object { $_.Status -eq "Stopped" }
# 100MB を超えるファイルだけ表示
Get-ChildItem -File |
Where-Object { $_.Length -gt 100MB }
# 名前に backup を含むファイルだけ表示
Get-ChildItem -File |
Where-Object { $_.Name -like "*backup*" }
$_ は、パイプラインで流れてきた現在のオブジェクトを表します。
Where-Object { $_.Length -gt 100MB }
これは「現在見ているファイルの Length が 100MB より大きいか」を判定しています。
PowerShell 3.0 以降では、簡略構文も使えます。
Get-Service | Where-Object Status -EQ "Stopped"
ただし、初心者のうちは scriptblock 構文の方が意味を追いやすいです。
Get-Service | Where-Object { $_.Status -eq "Stopped" }
Sort-Object ── 並べる
# メモリ使用量の大きい順
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet
# 更新日時の新しい順
Get-ChildItem -File |
Sort-Object LastWriteTime -Descending |
Select-Object -First 20 Name, LastWriteTime
Select-Object ── 必要な列だけ選ぶ
Get-Process |
Select-Object Name, Id, CPU, WorkingSet
件数を絞るときにも使います。
Get-Process | Select-Object -First 5
Get-Process | Select-Object -Last 5
CSV に出す前は、Select-Object で必要な列だけに整理しておくと扱いやすくなります。
Get-Service |
Select-Object Name, DisplayName, Status, StartType |
Export-Csv .\services.csv -NoTypeInformation -Encoding UTF8
7. Format 系コマンドは最後に使う
PowerShell には、表示を整えるためのコマンドがあります。
Format-Table
Format-List
Format-Wide
これらは「画面表示用」です。
CSV に出力する前や、後続処理に渡す前に使うと、元のプロパティではなく表示用オブジェクトになってしまいます。
# 避ける: CSV に表示用情報が混ざる
Get-Process |
Format-Table Name, CPU |
Export-Csv .\process.csv -NoTypeInformation
# 正しい: 先にプロパティを選んで CSV 出力
Get-Process |
Select-Object Name, CPU |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
Format-*は「最後に画面へ見せるため」と覚えると事故が減ります。
8. ファイル・フォルダー操作の基本
PowerShell で最もよく使うのは、ファイルやフォルダーの操作です。
| やりたいこと | コマンド |
|---|---|
| 現在の場所を見る | Get-Location |
| 場所を移動する | Set-Location |
| 一覧を見る | Get-ChildItem |
| ファイル・フォルダーを作る | New-Item |
| コピーする | Copy-Item |
| 移動する | Move-Item |
| 名前を変える | Rename-Item |
| 削除する | Remove-Item |
| 存在確認する | Test-Path |
現在の場所を確認する
Get-Location
移動します。
Set-Location C:\Work
パスに空白が含まれる場合は引用符で囲みます。
Set-Location "C:\Work Files\Reports"
ファイル一覧を見る
Get-ChildItem
Get-ChildItem -File
Get-ChildItem -Directory
Get-ChildItem -Recurse
拡張子で絞る場合は -Filter が便利です。
Get-ChildItem -Filter *.log
サブフォルダーも含めて検索する場合は -Recurse を使います。
Get-ChildItem C:\Logs -Filter *.log -Recurse
大量のファイルがある場所では、いきなり -Recurse せず、対象フォルダーを限定してから実行します。
作成する
# フォルダー作成
New-Item -ItemType Directory -Path .\archive
# 空ファイル作成
New-Item -ItemType File -Path .\memo.txt
既に存在する可能性がある場合は、先に確認します。
if (-not (Test-Path .\archive)) {
New-Item -ItemType Directory -Path .\archive
}
コピーする
Copy-Item .\report.xlsx .\backup\report.xlsx
フォルダーごとコピーする場合は -Recurse を使います。
Copy-Item .\data .\backup\data -Recurse
上書きが絡む場合は、事前に影響を確認します。
Copy-Item .\data .\backup\data -Recurse -WhatIf
移動する
Move-Item .\old.log .\archive\old.log
複数ファイルを条件で移動する場合は、最初に -WhatIf を付けます。
Get-ChildItem .\logs -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Move-Item -Destination .\archive -WhatIf
問題なければ -WhatIf を外します。
Get-ChildItem .\logs -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Move-Item -Destination .\archive
削除する
削除は特に慎重に扱います。
Remove-Item .\old.log -WhatIf
対象が正しいことを確認してから実行します。
Remove-Item .\old.log
ワイルドカードと -Recurse の組み合わせは強力です。最初から本番フォルダーで実行せず、一覧表示で確認します。
# まず対象を確認
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Select-Object FullName, Length, LastWriteTime
# 次に削除予定を確認
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Remove-Item -WhatIf
# 最後に実行
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Remove-Item
9. テキストファイルを読む・探す・書く
ログ調査では、テキストファイル操作をよく使います。
ファイルを読む
Get-Content .\app.log
末尾だけ見る場合は -Tail を使います。
Get-Content .\app.log -Tail 50
追記されるログを眺める場合は -Wait を使います。
Get-Content .\app.log -Tail 20 -Wait
文字列を検索する
Select-String -Path .\app.log -Pattern "ERROR"
複数ファイルを対象にできます。
Select-String -Path .\logs\*.log -Pattern "ERROR", "WARN"
検索結果から、ファイル名・行番号・内容を取り出して CSV にすることもできます。
Select-String -Path .\logs\*.log -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8
ファイルへ書き込む
"hello" | Set-Content .\memo.txt -Encoding UTF8
"next line" | Add-Content .\memo.txt -Encoding UTF8
コマンド結果を保存する場合は、Out-File より Export-Csv や ConvertTo-Json の方が後で扱いやすいことがあります。
Get-Process |
Select-Object Name, Id, CPU |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
10. CSV を扱う基本
業務自動化では、CSV は非常によく出てきます。
PowerShell では、CSV を文字列ではなく「列を持ったオブジェクト」として扱えます。
CSV を読み込む
たとえば、次のような users.csv があるとします。
Name,Department,Enabled
Suzuki,Sales,true
Tanaka,Accounting,false
Sato,Sales,true
読み込みます。
$users = Import-Csv .\users.csv
$users
列名がプロパティになります。
$users | Select-Object Name, Department
条件で絞る
$users |
Where-Object { $_.Department -eq "Sales" }
CSV の値は文字列として入ることが多いため、true / false や数値を扱う場合は注意します。
$users |
Where-Object { $_.Enabled -eq "true" }
CSV に出力する
$users |
Where-Object { $_.Department -eq "Sales" } |
Export-Csv .\sales-users.csv -NoTypeInformation -Encoding UTF8
Export-Csv の前に Format-Table を入れないことが重要です。
# 避ける
$users | Format-Table | Export-Csv .\out.csv -NoTypeInformation
# 正しい
$users | Select-Object Name, Department, Enabled | Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8
11. JSON を扱う基本
設定ファイルや Web API では JSON もよく使います。
$data = Get-Content .\settings.json -Raw | ConvertFrom-Json
$data
オブジェクトを JSON に変換します。
[pscustomobject]@{
Name = "BatchJob"
Enabled = $true
Retry = 3
} | ConvertTo-Json
深い階層を含む場合は -Depth を指定します。
$config | ConvertTo-Json -Depth 10 | Set-Content .\settings.json -Encoding UTF8
12. プロセスとサービスの基本
プロセスを見る
Get-Process
メモリ使用量の大きいプロセスを確認します。
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet
名前で絞ります。
Get-Process -Name notepad
停止は慎重に行います。
Stop-Process -Name notepad -WhatIf
問題なければ実行します。
Stop-Process -Name notepad
サービスを見る
Get-Service
停止中のサービスだけ見る場合です。
Get-Service |
Where-Object { $_.Status -eq "Stopped" }
名前で絞ります。
Get-Service -Name "Spooler"
再起動する場合も、対象確認を先に行います。
Get-Service -Name "Spooler"
Restart-Service -Name "Spooler" -WhatIf
サービス操作は業務影響が出やすいため、本番環境では手順書、メンテナンス時間、復旧方法を先に確認します。
13. イベントログの基本
Windows の調査ではイベントログが重要です。
最近のエラーを確認します。
Get-WinEvent -LogName System -MaxEvents 100 |
Where-Object { $_.LevelDisplayName -eq "Error" } |
Select-Object TimeCreated, ProviderName, Id, Message
アプリケーションログの直近50件を見ます。
Get-WinEvent -LogName Application -MaxEvents 50 |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
期間で絞る場合です。
$start = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = $start
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
調査結果は CSV に残しておくと、後で共有しやすくなります。
Get-WinEvent -LogName System -MaxEvents 500 |
Where-Object { $_.LevelDisplayName -in @("Error", "Warning") } |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Export-Csv .\system-events.csv -NoTypeInformation -Encoding UTF8
14. 変数・配列・ハッシュテーブル
短いコマンドだけでも作業できますが、少し長くなると変数が便利です。
変数
$path = "C:\Logs"
Get-ChildItem $path
PowerShell の変数は $ で始まります。
$today = Get-Date
$limit = (Get-Date).AddDays(-30)
配列
$extensions = @("*.log", "*.txt", "*.csv")
foreach ($ext in $extensions) {
Get-ChildItem C:\Work -Filter $ext
}
ハッシュテーブル
ハッシュテーブルは、キーと値の組み合わせです。
$params = @{
Path = "C:\Logs"
Filter = "*.log"
Recurse = $true
}
Get-ChildItem @params
この @params のような書き方を「スプラッティング」と呼びます。パラメーターが増えたときに読みやすくなります。
15. PSCustomObject で結果を整える
調査結果を表形式でまとめたいときは、[pscustomobject] が便利です。
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
UserName = $env:USERNAME
CheckedAt = Get-Date
}
複数の結果を作って CSV にできます。
Get-ChildItem C:\Logs -Filter *.log |
ForEach-Object {
[pscustomobject]@{
Name = $_.Name
FullName = $_.FullName
SizeMB = [math]::Round($_.Length / 1MB, 2)
LastWriteTime = $_.LastWriteTime
}
} |
Export-Csv .\log-files.csv -NoTypeInformation -Encoding UTF8
16. スクリプトファイル .ps1 の基本
よく使う処理は .ps1 ファイルにします。
例として、古いログを一覧化するスクリプトを作ります。
# Find-OldLogs.ps1
param(
[string]$Path = "C:\Logs",
[int]$Days = 30,
[string]$OutputPath = ".\old-logs.csv"
)
$limit = (Get-Date).AddDays(-$Days)
Get-ChildItem -Path $Path -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit } |
Select-Object FullName, Length, LastWriteTime |
Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Exported: $OutputPath"
実行例です。
.\Find-OldLogs.ps1 -Path C:\Logs -Days 60 -OutputPath .\old-logs.csv
引数を param() で受け取ると、後から条件を変えやすくなります。
17. 実行ポリシーの基本
.ps1 を実行しようとして、次のようなエラーが出ることがあります。
このシステムではスクリプトの実行が無効になっているため...
その場合は、現在の実行ポリシーを確認します。
Get-ExecutionPolicy
Get-ExecutionPolicy -List
個人の開発端末で、ローカル作成スクリプトを実行したいだけなら、現在ユーザーのスコープで RemoteSigned にすることが多いです。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
ただし、会社 PC ではグループポリシーで制御されている場合があります。無理に回避せず、管理者や運用ルールを確認します。
実行ポリシーは、PowerShell のスクリプト実行条件を制御する安全機能です。ただし、完全なセキュリティ境界ではありません。組織では署名、AppLocker、Microsoft Defender、権限管理、ログ監査と組み合わせて考える必要があります。
18. エラー処理の基本
PowerShell は、エラーが出ても処理を続ける場合があります。
重要な処理では、-ErrorAction Stop と try/catch を使います。
try {
Copy-Item .\source.txt .\backup\source.txt -ErrorAction Stop
Write-Host "Copy succeeded"
}
catch {
Write-Error "Copy failed: $($_.Exception.Message)"
}
複数のファイルを処理する場合も、失敗を記録すると後で追跡できます。
$results = foreach ($file in Get-ChildItem .\input -File) {
try {
Copy-Item $file.FullName .\backup -ErrorAction Stop
[pscustomobject]@{
FileName = $file.Name
Status = "OK"
Message = ""
}
}
catch {
[pscustomobject]@{
FileName = $file.Name
Status = "NG"
Message = $_.Exception.Message
}
}
}
$results | Export-Csv .\copy-result.csv -NoTypeInformation -Encoding UTF8
19. 変更系コマンドを安全に実行する順番
PowerShell では、削除・移動・停止のような変更系コマンドを安全に扱う手順が重要です。
基本は次の順番です。
1. Get 系で対象を見る
2. Where-Object で絞る
3. Select-Object で対象一覧を確認する
4. Export-Csv で記録する
5. -WhatIf で変更予定を確認する
6. 本実行する
例として、30日より古い .tmp ファイルを削除する場合です。
Step 1: 対象を見る
Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse
Step 2: 条件で絞る
$limit = (Get-Date).AddDays(-30)
Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
Step 3: 必要な列だけ表示する
$targets = Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
$targets |
Select-Object FullName, Length, LastWriteTime
Step 4: 証跡を残す
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\delete-targets.csv -NoTypeInformation -Encoding UTF8
Step 5: WhatIf で確認する
$targets | Remove-Item -WhatIf
Step 6: 実行する
$targets | Remove-Item
この順番にすると、「何を消したのか分からない」という事故を減らせます。
20. よく使う基本コマンド一覧
場所・ファイル
| 目的 | コマンド例 |
|---|---|
| 現在のフォルダーを表示 | Get-Location |
| フォルダー移動 | Set-Location C:\Work |
| 一覧表示 | Get-ChildItem |
| ファイルだけ表示 | Get-ChildItem -File |
| フォルダーだけ表示 | Get-ChildItem -Directory |
| サブフォルダーも検索 | Get-ChildItem -Recurse |
| 存在確認 | Test-Path .\file.txt |
| フォルダー作成 | New-Item -ItemType Directory .\backup |
| コピー | Copy-Item .\a.txt .\backup\a.txt |
| 移動 | Move-Item .\a.txt .\archive\a.txt |
| 削除予定確認 | Remove-Item .\a.txt -WhatIf |
オブジェクト加工
| 目的 | コマンド例 |
|---|---|
| 条件で絞る | Where-Object { $_.Status -eq "Running" } |
| 並べる | Sort-Object LastWriteTime -Descending |
| 列を選ぶ | Select-Object Name, LastWriteTime |
| 上位だけ表示 | Select-Object -First 10 |
| 各要素を処理 | ForEach-Object { $_.Name } |
| 中身を調べる | Get-Member |
入出力
| 目的 | コマンド例 |
|---|---|
| テキストを読む | Get-Content .\app.log |
| 末尾を見る | Get-Content .\app.log -Tail 50 |
| 文字列検索 | Select-String -Path .\app.log -Pattern "ERROR" |
| CSV 読み込み | Import-Csv .\users.csv |
| CSV 出力 | Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8 |
| JSON 読み込み | Get-Content .\a.json -Raw | ConvertFrom-Json |
| JSON 出力 | $obj | ConvertTo-Json -Depth 10 |
Windows 調査
| 目的 | コマンド例 |
|---|---|
| プロセス一覧 | Get-Process |
| サービス一覧 | Get-Service |
| イベントログ | Get-WinEvent -LogName System -MaxEvents 100 |
| 環境変数 | Get-ChildItem Env: |
| PowerShell バージョン | $PSVersionTable |
| 実行ポリシー | Get-ExecutionPolicy -List |
21. 実務サンプル: ログを調査してレポートを作る
次のような要件を考えます。
C:\App\Logs 以下の .log ファイルから、直近7日以内に更新され、ERROR を含む行を探し、CSV にまとめたい。
いきなり完成形を書かず、段階的に作ります。
Step 1: ログファイルを探す
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse
Step 2: 直近7日以内に絞る
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since }
Step 3: ERROR を検索する
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern "ERROR"
Step 4: CSV に出力する
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-report.csv -NoTypeInformation -Encoding UTF8
Step 5: スクリプト化する
# Export-ErrorReport.ps1
param(
[string]$LogPath = "C:\App\Logs",
[int]$Days = 7,
[string]$Pattern = "ERROR",
[string]$OutputPath = ".\error-report.csv"
)
$since = (Get-Date).AddDays(-$Days)
Get-ChildItem $LogPath -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern $Pattern |
Select-Object Path, LineNumber, Line |
Export-Csv $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Exported: $OutputPath"
実行例です。
.\Export-ErrorReport.ps1 -LogPath C:\App\Logs -Days 14 -Pattern "ERROR|FATAL" -OutputPath .\errors.csv
22. 実務サンプル: 古いファイルをアーカイブする
次は、削除ではなく移動にする例です。
C:\Work\Reports のうち、90日以上更新されていない .xlsx を C:\Work\Archive に移動する。
対象確認
$source = "C:\Work\Reports"
$dest = "C:\Work\Archive"
$limit = (Get-Date).AddDays(-90)
$targets = Get-ChildItem $source -Filter *.xlsx -File |
Where-Object { $_.LastWriteTime -lt $limit }
$targets | Select-Object FullName, Length, LastWriteTime
アーカイブ先作成
if (-not (Test-Path $dest)) {
New-Item -ItemType Directory -Path $dest
}
証跡出力
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\archive-targets.csv -NoTypeInformation -Encoding UTF8
WhatIf 確認
$targets | Move-Item -Destination $dest -WhatIf
実行
$targets | Move-Item -Destination $dest
ファイル名重複があり得る場合は、このままだと失敗します。実務では、年月フォルダーを分ける、移動先ファイル名に日時を付ける、既存ファイルがあればスキップする、といったルールを先に決めます。
23. よくあるつまずき
| 症状 | 原因 | 対処 |
|---|---|---|
| コマンドが長くて覚えられない | 暗記しようとしている | Get-Command、Get-Help -Examples で探す |
$_ が分からない |
パイプライン現在値の理解不足 | Where-Object { $_.Name -like "*log*" } の形で覚える |
| CSV が変な内容になる | Format-Table 後に Export-Csv している |
Select-Object 後に Export-Csv する |
| パスに空白があると失敗する | 引用符がない | "C:\Work Files\a.txt" のように囲む |
| スクリプトが実行できない | 実行ポリシー | Get-ExecutionPolicy -List で確認する |
| 削除対象が多すぎる | 条件が広すぎる | 先に Select-Object FullName と -WhatIf で確認する |
| プロパティ名が分からない | オブジェクト構造を見ていない | Get-Member を使う |
| 文字化けする | エンコーディングの前提が違う | 入出力の -Encoding と利用アプリを確認する |
24. コマンドを覚える順番
最初からすべてのコマンドを覚える必要はありません。
次の順番がおすすめです。
第1段階: 見る・探す
Get-Command
Get-Help
Get-Member
Get-Location
Set-Location
Get-ChildItem
Get-Content
Select-String
第2段階: 絞る・整える
Where-Object
Sort-Object
Select-Object
ForEach-Object
Format-Table
Format-List
第3段階: 入出力する
Import-Csv
Export-Csv
ConvertFrom-Json
ConvertTo-Json
Set-Content
Add-Content
Out-File
第4段階: 変更する
New-Item
Copy-Item
Move-Item
Rename-Item
Remove-Item
Start-Service
Stop-Service
Restart-Service
Stop-Process
変更系は、必ず確認系のコマンドとセットで覚えます。
# 見る
Get-ChildItem .\logs -Filter *.tmp
# 削除予定を見る
Get-ChildItem .\logs -Filter *.tmp | Remove-Item -WhatIf
# 実行
Get-ChildItem .\logs -Filter *.tmp | Remove-Item
25. 現場での運用チェックリスト
PowerShell を業務で使う場合は、次の観点を確認しておくと安全です。
- 実行する PowerShell が
powershell.exeなのかpwsh.exeなのか確認した $PSVersionTableでバージョンを確認した- 変更前に
Get-*系で対象を表示した Where-Objectの条件を画面で確認した- 削除・移動・停止の前に
-WhatIfを使った - 実行前の対象一覧を CSV に保存した
- 本番環境ではバックアップまたは復旧手順を確認した
- スクリプトの実行ポリシーと社内ルールを確認した
- エラー時のログ出力を用意した
- 共有するスクリプトではエイリアスではなく正式なコマンド名を使った
26. まとめ
PowerShell の基本は、コマンドを大量に暗記することではありません。
実務では、次の型を身につけることが重要です。
Get-Command で探す
Get-Help で使い方を見る
Get-Member でプロパティを確認する
Get-* で対象を見る
Where-Object で絞る
Select-Object で列を整える
Export-Csv で証跡を残す
-WhatIf で変更予定を確認する
最後に実行する
特に、PowerShell はファイル削除、サービス停止、プロセス終了、レジストリ操作までできる強力な環境です。
だからこそ、最初に覚えるべきなのは「危ないコマンド」ではなく、「安全に対象を確認する手順」です。
見る → 絞る → 記録する → 予行する → 実行する
この順番を守れば、PowerShell は単なる黒い画面ではなく、Windows 業務を整理・調査・自動化するための実用的な道具になります。
参考リンク
- PowerShell Documentation - Microsoft Learn
- Windows に PowerShell 7 をインストールする - Microsoft Learn
- Windows PowerShell 5.1 と PowerShell 7.x の違い - Microsoft Learn
- Get-Command - Microsoft Learn
- Get-Help - Microsoft Learn
- Get-Member - Microsoft Learn
- about_Pipelines - Microsoft Learn
- Where-Object - Microsoft Learn
- Select-Object - Microsoft Learn
- Import-Csv - Microsoft Learn
- Export-Csv - Microsoft Learn
- about_Execution_Policies - Microsoft Learn
関連する記事
このテーマがつながるサービス
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
古いバッチ、VBScript、VBA、PowerShell、COM / ActiveX を含む既存資産の棚卸し、改修、移行を支援します。
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす
PowerShellで日常作業に使う実用コマンドとして、Measure-Object、Group-Object、Select-String、Compare-Object、Tee-Object、Start-Transcriptなどの使いどころを整理します。
PowerShellスクリプト応用 ── ログ調査・アーカイブ・レポート化を安全に自動化する
PowerShellスクリプトでログ調査、CSVレポート、古いログのアーカイブ、証跡保存、タスクスケジューラ実行までを安全に進める実務手順を整理します。
VBScript非推奨化に備える移行ガイド
Windows の VBScript 段階廃止に向け、VBA や Excel マクロ、社内ツールの依存を棚卸しし、静的検出と実行ログで隠れた呼び出しを洗い出す手順、PowerShell や Office Scripts などへの代替選定、署名運用と段階展開までを実務目線で整...
IEモード依存システムの脱却ガイド
Microsoft Edge の IE モード依存をかかえた社内 Web システムを安全に延命しつつ脱却する実務手順を、サイトリスト集中管理、ニュートラルサイト、WebView2 ラッパー、段階的リファクタリング、VDI 隔離、ガバナンス設計まで読者がそのまま着手できる粒度...
Office 2024 / Microsoft 365 で ActiveX が動かないときの対処ガイド
Office 2024 と Microsoft 365 で ActiveX が動かない原因を、設定既定値、bitness、COM 登録、依存ランタイム、IE モードの順で切り分ける実務手順をまとめた現場向けガイドです。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
COM / ActiveX / OCX、32bit / 64bit 制約を抱える既存資産の活用と移行を支援します。