PowerShellコマンドの基本 ── まず覚える操作と安全な使い方

· · PowerShell, Windows, コマンドライン, 自動化, 既存資産活用

1. 最初に押さえるべきこと

PowerShell は、Windows の設定確認、ファイル整理、ログ調査、CSV 加工、サービス操作、定型作業の自動化に使えるコマンド環境です。

ただし、最初から複雑なスクリプトを書く必要はありません。まずは次の流れだけ覚えると、実務でかなり使えるようになります。

探す  見る  絞る  並べる  出力する  必要なら変更する

PowerShell の基本は「長いコマンドを暗記すること」ではありません。

重要なのは、次の3つです。

  1. Get-CommandGet-Help でコマンドを調べられること
  2. | パイプラインで結果を次のコマンドへ渡せること
  3. 削除・停止・変更の前に -WhatIf-Confirm で影響を確認すること

PowerShell は「調査」と「変更」を同じ画面で実行できます。便利な反面、削除や停止もすぐ実行できるため、読み取り専用の確認から始める癖が重要です。

2. PowerShell とコマンドプロンプトの違い

PowerShell は、従来のコマンドプロンプト(cmd.exe)と似て見えますが、内部の考え方が違います。

観点 コマンドプロンプト PowerShell
主な出力 文字列 オブジェクト
コマンド名 dircopy など Get-ChildItemCopy-Item など
結果の加工 文字列処理が中心 プロパティを使って絞り込み・並べ替え
自動化 バッチファイル .ps1 スクリプト
得意分野 古いコマンド資産との互換 Windows 管理、CSV、JSON、API、定型作業

たとえば、ファイル一覧を取得する場合、cmd.exe では dir の表示結果を文字列として眺めることが多くなります。

PowerShell では、ファイルが NameLengthLastWriteTime などのプロパティを持つオブジェクトとして扱われます。

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

dirlscatcd のような短い名前も使えますが、多くはエイリアスです。

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

たとえば、サービスには StatusName などのプロパティがあります。

Get-Service | Select-Object Name, Status

ファイルには NameLengthLastWriteTime などがあります。

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-CsvConvertTo-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 Stoptry/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-CommandGet-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 業務を整理・調査・自動化するための実用的な道具になります。

参考リンク

関連する記事

このテーマがつながるサービス

Windowsアプリ開発

業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。

サービスを見る / お問い合わせ

既存資産活用・移行支援

古いバッチ、VBScript、VBA、PowerShell、COM / ActiveX を含む既存資産の棚卸し、改修、移行を支援します。

お問い合わせ

関連する記事

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

VBScript非推奨化に備える移行ガイド

Windows の VBScript 段階廃止に向け、VBA や Excel マクロ、社内ツールの依存を棚卸しし、静的検出と実行ログで隠れた呼び出しを洗い出す手順、PowerShell や Office Scripts などへの代替選定、署名運用と段階展開までを実務目線で整...

記事を読む

IEモード依存システムの脱却ガイド

Microsoft Edge の IE モード依存をかかえた社内 Web システムを安全に延命しつつ脱却する実務手順を、サイトリスト集中管理、ニュートラルサイト、WebView2 ラッパー、段階的リファクタリング、VDI 隔離、ガバナンス設計まで読者がそのまま着手できる粒度...

記事を読む

関連トピック

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

このテーマがつながるサービス

この記事は次のサービスページにつながります。近い入口からご覧ください。

ブログ一覧に戻る