PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす
1. 最初に押さえるべきこと
PowerShell の基本を覚えたら、次は「よく使う小さな機能」を増やしていくと実務で使いやすくなります。
ここでいう小さな機能とは、短いエイリアスのことではありません。
この記事では、ls や cat のような省略形ではなく、Get-ChildItem、Get-Content、Select-String のような正式なコマンド名を使います。
そのうえで、次のような作業を、1行または数行のコマンドでできるようにします。
件数を数える
合計サイズを調べる
重複を消す
種類ごとに集計する
必要な値だけ取り出す
2つの結果を比較する
ログの前後行を見る
クリップボードへ送る
実行結果を保存しながら画面にも出す
環境変数やネットワークを確認する
PowerShell は、長いスクリプトを書かなくても便利です。
まずは「よく使う部品」を増やして、日常作業の中で少しずつ組み合わせられるようにしていきます。
コマンドを暗記するよりも、「こういう時はこの部品が使える」と思い出せることが大事です。
2. 今回の考え方
前提は、次の3つです。
- コマンド名は正式名で書く
- 読み取り系のコマンドを中心にする
- 変更系のコマンドは、必ず対象確認や
-WhatIfと一緒に考える
たとえば、ファイルを削除するコマンドをいきなり覚えるよりも、先に次の流れを身につける方が安全です。
対象を見る
→ 条件で絞る
→ 件数を数える
→ 必要なら CSV に残す
→ 変更予定を確認する
→ 実行する
この記事では、削除や停止のような強い操作よりも、調査・集計・比較・出力を中心に扱います。
3. よく使うコマンドの地図
今回使う主なコマンドです。
| やりたいこと | コマンド |
|---|---|
| 件数や合計を調べる | Measure-Object |
| 重複を整理する | Sort-Object -Unique |
| 種類ごとに集計する | Group-Object |
| 必要な列だけ出す | Select-Object |
| 各要素を処理する | ForEach-Object |
| 文字列を検索する | Select-String |
| 2つの結果を比較する | Compare-Object |
| ハッシュ値を計算する | Get-FileHash |
| クリップボードを使う | Set-Clipboard / Get-Clipboard |
| 画面とファイルの両方に出す | Tee-Object |
| 処理時間を測る | Measure-Command |
| エラー詳細を見る | Get-Error |
| ネットワーク疎通を確認する | Test-Connection / Test-NetConnection |
全部を一度に覚える必要はありません。
「数えるなら Measure-Object」「まとめるなら Group-Object」「比べるなら Compare-Object」のように、目的とセットで覚えるのがおすすめです。
4. 件数を数える ── Measure-Object
まずよく使うのが、件数を数える操作です。
現在のフォルダーにあるファイル数を数えます。
Get-ChildItem . -File | Measure-Object
サブフォルダーも含めて数える場合です。
Get-ChildItem . -File -Recurse | Measure-Object
Measure-Object の結果にある Count が件数です。
ファイルサイズの合計を見たい場合は、Length を集計します。
Get-ChildItem . -File -Recurse |
Measure-Object -Property Length -Sum
ただし、このままだとバイト数なので、人間には少し読みにくいです。
GB 単位に直します。
$size = Get-ChildItem . -File -Recurse |
Measure-Object -Property Length -Sum
[math]::Round($size.Sum / 1GB, 2)
これは、フォルダー全体のサイズをざっくり見たいときに便利です。
5. 最大・平均も調べる
Measure-Object は、合計だけでなく、最大値や平均値も出せます。
Get-ChildItem . -File |
Measure-Object -Property Length -Sum -Average -Maximum -Minimum
ファイルサイズのばらつきを見るときに使えます。
プロセスの CPU 使用量を合計することもできます。
Get-Process |
Measure-Object -Property CPU -Sum
ただし、プロセスの値は実行タイミングによって変わります。
調査用として見る場合は十分ですが、厳密な監視をしたい場合は専用の監視ツールやログの設計も必要です。
6. 値だけ取り出す ── Select-Object -ExpandProperty
Select-Object は、列を選ぶときによく使います。
Get-Process |
Select-Object Name, Id, CPU
これは「Name、Id、CPU という列を持ったオブジェクト」を出します。
一方で、値だけを取り出したい場合は -ExpandProperty を使います。
Get-Process -Name notepad -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty Id
ファイル名だけを取り出す場合も同じです。
Get-ChildItem . -File |
Select-Object -ExpandProperty Name
コマンドの結果を、別のコマンドやテキストファイルに渡したいときは、-ExpandProperty が便利です。
たとえば、ファイル名一覧だけを保存します。
Get-ChildItem . -File |
Select-Object -ExpandProperty Name |
Set-Content .\file-names.txt -Encoding UTF8
Select-Object Name と Select-Object -ExpandProperty Name は似ていますが、結果の形が違います。
Select-Object Name
→ Name という列を持つ表
Select-Object -ExpandProperty Name
→ Name の値そのもの
CSV にしたいなら列として残す方がよく、別の文字列処理に渡したいなら値だけの方が扱いやすいです。
7. 重複を消す ── Sort-Object -Unique
ファイルの拡張子だけを一覧にしたい場合です。
Get-ChildItem . -File |
Select-Object -ExpandProperty Extension |
Sort-Object -Unique
実行すると、.txt、.log、.csv のように、重複を除いた拡張子だけが表示されます。
プロセス名の種類だけを見ることもできます。
Get-Process |
Select-Object -ExpandProperty ProcessName |
Sort-Object -Unique
ユーザー一覧 CSV から部署名の一覧だけを取り出す例です。
Import-Csv .\users.csv |
Select-Object -ExpandProperty Department |
Sort-Object -Unique
「一覧に同じ値がたくさん出て見づらい」というときは、まず Sort-Object -Unique を思い出すと便利です。
8. 種類ごとに集計する ── Group-Object
重複を消すだけでなく、「何が何件あるか」を見たい場合は Group-Object を使います。
拡張子ごとにファイル数を数えます。
Get-ChildItem . -File |
Group-Object -Property Extension -NoElement |
Sort-Object -Property Count -Descending
-NoElement を付けると、各グループの中身を省略して、件数だけを見やすくできます。
サービスの状態ごとに数えます。
Get-Service |
Group-Object -Property Status -NoElement
イベントログのレベルごとに数えます。
Get-WinEvent -LogName System -MaxEvents 500 |
Group-Object -Property LevelDisplayName -NoElement
Group-Object は、調査の最初に全体像をつかむときに向いています。
どの拡張子が多いか
どの状態のサービスが多いか
どのエラーレベルが多いか
どの部署のデータが多いか
細かい中身を見る前に、まず分布を見たいときに使います。
9. 必要な列を作る ── 計算した列を追加する
ファイルサイズは Length で取れますが、単位はバイトです。
毎回バイト数を見るのはつらいので、MB や KB に直した列を作ると便利です。
Get-ChildItem . -File |
Select-Object Name, @{Name="SizeKB"; Expression={ [math]::Round($_.Length / 1KB, 1) }}, LastWriteTime
サブフォルダーも含めて、大きいファイル順に見る例です。
Get-ChildItem . -File -Recurse |
Sort-Object -Property Length -Descending |
Select-Object -First 20 FullName, @{Name="SizeMB"; Expression={ [math]::Round($_.Length / 1MB, 2) }}, LastWriteTime
@{Name="..."; Expression={ ... }} は、計算した列を作る書き方です。
最初は少し長く見えますが、実務ではよく使います。
たとえば、プロセスのメモリ使用量を MB で表示できます。
Get-Process |
Sort-Object -Property WorkingSet -Descending |
Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}
レポートに出すときは、元の Length よりも SizeMB のような列の方が読みやすくなります。
10. 新しい順・古い順・大きい順に見る
PowerShell では、並べ替えは Sort-Object です。
最近更新されたファイルを見ます。
Get-ChildItem . -File |
Sort-Object -Property LastWriteTime -Descending |
Select-Object -First 10 Name, LastWriteTime
古いファイルを見ます。
Get-ChildItem . -File |
Sort-Object -Property LastWriteTime |
Select-Object -First 10 Name, LastWriteTime
大きいファイルを見ます。
Get-ChildItem . -File -Recurse |
Sort-Object -Property Length -Descending |
Select-Object -First 10 FullName, Length
この3つはよく使います。
新しい順 → LastWriteTime -Descending
古い順 → LastWriteTime
大きい順 → Length -Descending
ログ調査、不要ファイル整理、ディスク容量調査で出番が多い組み合わせです。
11. Format 系は画面表示の最後だけに使う
画面で見やすくしたいときは Format-Table や Format-List を使います。
Get-Process |
Sort-Object -Property WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet |
Format-Table -AutoSize
1件の詳細を見る場合は Format-List が便利です。
Get-Process -Id $PID |
Format-List *
ただし、Format-Table や Format-List は「表示用」です。
CSV に出す前や、次のコマンドで加工する前には使わない方が安全です。
# 避ける
Get-Process |
Format-Table Name, Id |
Export-Csv .\process.csv -NoTypeInformation
CSV に出すなら、Select-Object で列を選びます。
# 正しい
Get-Process |
Select-Object Name, Id |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
迷ったら、次のように考えます。
画面で見るだけ → Format-Table / Format-List
後で使う → Select-Object
12. ログ検索を少し便利にする ── Select-String
文字列検索には Select-String を使います。
Select-String -Path .\logs\*.log -Pattern "ERROR"
複数のパターンも指定できます。
Select-String -Path .\logs\*.log -Pattern "ERROR", "WARN", "FATAL"
前後の行も見たい場合は -Context を使います。
Select-String -Path .\logs\*.log -Pattern "ERROR" -Context 2
これは、該当行の前後2行も一緒に表示します。
エラーの前後関係を確認したいときに便利です。
単純な文字列として探したい場合は -SimpleMatch を使います。
Select-String -Path .\logs\*.log -Pattern "[ERROR]" -SimpleMatch
Select-String の -Pattern は、通常は正規表現として扱われます。
[ や . のような記号をそのまま探したい場合は、-SimpleMatch を付けると分かりやすくなります。
大文字・小文字を区別したい場合です。
Select-String -Path .\logs\*.log -Pattern "Error" -CaseSensitive
検索結果を CSV に残すこともできます。
Select-String -Path .\logs\*.log -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8
13. 文字列を置き換える
テキストの一部を置き換えるには -replace を使います。
"server01.example.com" -replace "\.example\.com$", ""
ファイルの中身を置き換える場合は、いきなり元ファイルに上書きしない方が安全です。
まず別ファイルに出します。
(Get-Content .\appsettings.json -Raw) -replace "localhost", "db01" |
Set-Content .\appsettings.preview.json -Encoding UTF8
確認してから、必要なら元ファイルへ反映します。
設定ファイルや一括置換では、置換対象が多すぎると事故になります。
先に Select-String で対象を確認してから置換すると安全です。
Select-String -Path .\appsettings.json -Pattern "localhost" -SimpleMatch
14. 2つの結果を比較する ── Compare-Object
Compare-Object は、2つの一覧の違いを見るコマンドです。
たとえば、変更前後のファイル名一覧を比較します。
Compare-Object `
-ReferenceObject (Get-Content .\before.txt) `
-DifferenceObject (Get-Content .\after.txt)
SideIndicator の意味は次の通りです。
| 表示 | 意味 |
|---|---|
<= |
左側、つまり ReferenceObject にだけある |
=> |
右側、つまり DifferenceObject にだけある |
== |
両方にある。-IncludeEqual を付けた場合に表示される |
フォルダーのファイル名一覧を保存して比較する例です。
Get-ChildItem .\before -File |
Select-Object -ExpandProperty Name |
Set-Content .\before-list.txt -Encoding UTF8
Get-ChildItem .\after -File |
Select-Object -ExpandProperty Name |
Set-Content .\after-list.txt -Encoding UTF8
Compare-Object `
-ReferenceObject (Get-Content .\before-list.txt) `
-DifferenceObject (Get-Content .\after-list.txt)
サービス一覧の変更を見ることもできます。
Get-Service |
Select-Object Name, Status |
Export-Csv .\services-before.csv -NoTypeInformation -Encoding UTF8
変更後に、もう一度出します。
Get-Service |
Select-Object Name, Status |
Export-Csv .\services-after.csv -NoTypeInformation -Encoding UTF8
比較します。
Compare-Object `
-ReferenceObject (Import-Csv .\services-before.csv) `
-DifferenceObject (Import-Csv .\services-after.csv) `
-Property Name, Status
作業前後の差分を残すと、調査や報告がしやすくなります。
15. ファイルのハッシュ値を確認する ── Get-FileHash
ダウンロードしたファイルや、配布ファイルが同じか確認したいときは、ハッシュ値を使います。
Get-FileHash .\installer.exe -Algorithm SHA256
フォルダー内のファイルをまとめて確認する場合です。
Get-ChildItem .\downloads -File |
ForEach-Object { Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 }
CSV に残すこともできます。
Get-ChildItem .\downloads -File |
ForEach-Object { Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 } |
Select-Object Path, Hash |
Export-Csv .\hashes.csv -NoTypeInformation -Encoding UTF8
ファイル名だけでは同じに見えても、中身が違うことがあります。
配布物、バックアップ、移行作業では、ハッシュ値を残しておくと確認しやすくなります。
16. クリップボードへ送る ── Set-Clipboard
コマンド結果をメールやチャットに貼りたいとき、クリップボードへ送ると便利です。
Get-Service |
Select-Object Name, Status |
ConvertTo-Csv -NoTypeInformation |
Set-Clipboard
クリップボードの中身を見る場合です。
Get-Clipboard
Excel に貼るためにタブ区切りにしたい場合は、ConvertTo-Csv の区切り文字をタブにします。
Get-Process |
Select-Object Name, Id, CPU |
ConvertTo-Csv -NoTypeInformation -Delimiter "`t" |
Set-Clipboard
一時的に結果を共有したいだけなら、毎回ファイルを作るより楽です。
ただし、証跡として残したい場合は Export-Csv でファイルに保存します。
17. 画面にも出して、ファイルにも残す ── Tee-Object
結果を画面で見ながら、同時にファイルにも残したいときは Tee-Object を使います。
Get-Process |
Sort-Object -Property WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet |
Tee-Object -FilePath .\top-process.txt
Tee-Object は、パイプラインの結果を2方向に流します。
画面に出す
ファイルにも保存する
調査中に「見ながら記録する」用途に向いています。
ただし、後で Excel で開きたいなら Export-Csv の方が扱いやすいです。
Get-Process |
Sort-Object -Property WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet |
Export-Csv .\top-process.csv -NoTypeInformation -Encoding UTF8
画面用なら Tee-Object、表データとして残すなら Export-Csv と考えると分かりやすいです。
18. 作業ログを残す ── Start-Transcript
一連の操作を記録したいときは Start-Transcript を使います。
Start-Transcript -Path .\work-log.txt
この後に実行したコマンドや画面出力が記録されます。
終了します。
Stop-Transcript
調査作業では、あとから次のことを確認したくなります。
どのコマンドを実行したか
どのフォルダーで作業したか
どんな結果が出たか
エラーが出たか
Start-Transcript を使うと、作業メモを取り忘れたときの保険になります。
ただし、パスワードやトークンなど、記録してはいけない情報が画面に出る作業では使い方に注意します。
19. CSV を読み込んで、条件で見る
業務データでは CSV がよく出てきます。
たとえば、次のような users.csv があるとします。
Name,Department,Enabled
Suzuki,Sales,true
Tanaka,Accounting,false
Sato,Sales,true
読み込みます。
Import-Csv .\users.csv
部署が Sales の人だけを見ます。
Import-Csv .\users.csv |
Where-Object { $_.Department -eq "Sales" }
有効なユーザーだけを別 CSV に出します。
Import-Csv .\users.csv |
Where-Object { $_.Enabled -eq "true" } |
Export-Csv .\enabled-users.csv -NoTypeInformation -Encoding UTF8
CSV の値は、文字列として扱われることが多いです。
そのため、true / false や数値を比較するときは、必要に応じて型変換を考えます。
たとえば、点数が80以上の行だけを見る場合です。
Import-Csv .\scores.csv |
Where-Object { [int]$_.Score -ge 80 }
20. JSON の設定値を見る
JSON は、設定ファイルや Web API でよく使われます。
$config = Get-Content .\settings.json -Raw | ConvertFrom-Json
$config
特定の値だけを見ることもできます。
$config.Database.Host
値を変更して、別ファイルに保存する例です。
$config.Database.Host = "db01"
$config |
ConvertTo-Json -Depth 10 |
Set-Content .\settings.updated.json -Encoding UTF8
JSON を扱うときは、Get-Content -Raw を使うことが多いです。
-Raw を付けると、ファイル全体を1つの文字列として読み込みます。
複数行の JSON を扱うときは、この方が分かりやすくなります。
21. 環境変数を見る
環境変数は、アプリの設定やパス確認でよく使います。
一覧を見ます。
Get-ChildItem Env:
現在のユーザー名を見ます。
$env:USERNAME
一時フォルダーを見ます。
$env:TEMP
PATH を見やすく分割します。
$env:PATH -split ";"
現在の PowerShell セッションだけで環境変数を設定します。
$env:APP_MODE = "Development"
この設定は、今開いている PowerShell の中だけで有効です。
ユーザー環境変数として保存する場合は、次のようにします。
[Environment]::SetEnvironmentVariable("APP_MODE", "Development", "User")
これは環境を変更する操作です。
会社 PC や本番サーバーでは、影響範囲を確認してから行います。
22. プロファイルを確認する
PowerShell には、起動時に読み込まれるプロファイルがあります。
場所を確認します。
$PROFILE
存在するか確認します。
Test-Path $PROFILE
作成する場合です。
New-Item -ItemType File -Path $PROFILE -Force
メモ帳で開きます。
notepad $PROFILE
よく使う設定や関数をプロファイルに書いておくと便利です。
ただし、プロファイルに複雑な処理を書きすぎると、PowerShell の起動が遅くなったり、別の環境で再現しにくくなったりします。
最初は、よく使うパスや表示設定くらいに留めるのがおすすめです。
23. プロセスを見る
プロセス調査では、まずメモリ使用量の大きい順に見ることが多いです。
Get-Process |
Sort-Object -Property WorkingSet -Descending |
Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}
特定の名前で絞ります。
Get-Process -Name notepad -ErrorAction SilentlyContinue
プロセスを停止する場合は、いきなり実行せず -WhatIf で確認します。
Stop-Process -Name notepad -WhatIf
問題なければ実行します。
Stop-Process -Name notepad
本番環境では、プロセス停止が業務影響につながることがあります。
停止する前に、対象、利用者、復旧方法を確認します。
24. サービスを見る
サービスの一覧を見ます。
Get-Service
停止中のサービスだけを見る場合です。
Get-Service |
Where-Object { $_.Status -eq "Stopped" }
自動起動なのに停止しているサービスを探します。
Get-Service |
Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
Select-Object Name, DisplayName, Status, StartType
サービスを再起動する場合も、まず対象を確認します。
Get-Service -Name "Spooler"
予行します。
Restart-Service -Name "Spooler" -WhatIf
サービス操作は影響が大きいため、メンテナンス時間や復旧手順を確認してから実行します。
25. イベントログを見る
Windows の調査では、イベントログを見る場面がよくあります。
システムログの直近100件を見ます。
Get-WinEvent -LogName System -MaxEvents 100 |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
エラーと警告だけに絞ります。
Get-WinEvent -LogName System -MaxEvents 500 |
Where-Object { $_.LevelDisplayName -in @("Error", "Warning") } |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
直近24時間のエラーだけを見ます。
$start = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{ LogName = "System"; StartTime = $start } |
Where-Object { $_.LevelDisplayName -eq "Error" } |
Select-Object TimeCreated, ProviderName, Id, 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
イベントログは件数が多くなりやすいため、-MaxEvents や期間指定で範囲を絞るのが大事です。
26. ネットワークを確認する
疎通確認には Test-Connection を使います。
Test-Connection example.com -Count 4
Windows で TCP ポートの疎通を確認する場合は、Test-NetConnection が便利です。
Test-NetConnection example.com -Port 443
DNS の解決を確認する場合です。
Resolve-DnsName example.com
ネットワーク調査では、次のように切り分けます。
名前解決できるか
IP へ届くか
目的のポートが開いているか
プロキシやファイアウォールの影響がないか
PowerShell だけで全部を判断するのではなく、切り分けの入口として使うと便利です。
27. Web の結果を見る
Web ページの取得には Invoke-WebRequest を使います。
Invoke-WebRequest https://example.com |
Select-Object StatusCode, StatusDescription
JSON API の結果を扱う場合は Invoke-RestMethod が便利です。
Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell |
Select-Object full_name, stargazers_count, forks_count
API の結果は、最初から PowerShell のオブジェクトとして扱えることが多いです。
そのため、Select-Object や Where-Object と組み合わせやすくなります。
社内 API を調べる場合も、まずは読み取り系の GET から始めます。
認証情報やトークンを扱う場合は、画面表示や transcript への記録に注意します。
28. 実行時間を測る ── Measure-Command
処理にどれくらい時間がかかるか知りたいときは Measure-Command を使います。
Measure-Command {
Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
Measure-Object
}
結果には TotalSeconds や TotalMilliseconds が含まれます。
$result = Measure-Command {
Get-ChildItem . -File -Recurse | Measure-Object
}
$result.TotalSeconds
スクリプトを速くしたいときは、感覚ではなく時間を測るのが大事です。
ただし、ファイル数、ディスク状態、ネットワーク状態によって結果は変わります。
1回の結果だけで判断せず、何度か確認します。
29. 時間のかかる処理を裏で動かす ── Start-Job
時間がかかる調査を、別ジョブとして実行したい場合は Start-Job を使います。
$job = Start-Job -ScriptBlock {
Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
Measure-Object
}
ジョブの状態を見ます。
Get-Job
結果を受け取ります。
Receive-Job $job
不要になったジョブを削除します。
Remove-Job $job
Start-Job は便利ですが、最初から多用する必要はありません。
まずは普通に実行し、時間がかかる処理だけジョブ化すると分かりやすくなります。
30. コマンド履歴を使う
過去に実行したコマンドを見るには Get-History を使います。
Get-History
コマンド行だけ見やすくします。
Get-History |
Select-Object Id, CommandLine
特定の履歴を再実行します。
Invoke-History 12
履歴は便利ですが、危険なコマンドも再実行できてしまいます。
Remove-Item や Stop-Process のような変更系コマンドを履歴から再実行するときは、内容を確認してから実行します。
31. エラーの詳細を見る ── Get-Error
PowerShell 7 では、直近のエラーを詳しく見るために Get-Error が使えます。
Get-Error
直近のエラーメッセージだけ見たい場合です。
$Error[0].Exception.Message
エラーが発生したときは、画面の赤い文字だけを見るのではなく、次の点を確認します。
どのコマンドで失敗したか
どのパスや対象で失敗したか
権限の問題か
ファイルが存在しないのか
ネットワークやロックの問題か
調査結果を残したい場合は、Start-Transcript や Export-Csv と組み合わせます。
32. よく使う比較演算子
Where-Object では、比較演算子をよく使います。
| 演算子 | 意味 | 例 |
|---|---|---|
-eq |
等しい | $_.Status -eq "Running" |
-ne |
等しくない | $_.Status -ne "Running" |
-gt |
より大きい | $_.Length -gt 10MB |
-ge |
以上 | $_.Length -ge 10MB |
-lt |
より小さい | $_.Length -lt 10MB |
-le |
以下 | $_.Length -le 10MB |
-like |
ワイルドカード一致 | $_.Name -like "*.log" |
-match |
正規表現一致 | $_.Name -match "^app" |
-in |
値が一覧に含まれる | $_.Status -in @("Running", "Paused") |
-contains |
一覧が値を含む | @("a", "b") -contains "a" |
例です。
Get-ChildItem . -File |
Where-Object { $_.Length -gt 10MB }
Get-Service |
Where-Object { $_.Status -in @("Running", "Paused") }
Get-ChildItem . -File |
Where-Object { $_.Name -match "\.log$" }
最初は -eq、-ne、-gt、-lt、-like だけでも十分です。
慣れてきたら、-match や -in を使うと条件を書きやすくなります。
33. ちょっとした実務レシピ
ここからは、実務でそのまま使いやすい形の例です。
拡張子ごとのファイル数を見る
Get-ChildItem C:\Work -File -Recurse |
Group-Object -Property Extension -NoElement |
Sort-Object -Property Count -Descending
フォルダーの中身をざっくり把握したいときに使います。
大きいファイル上位20件を見る
Get-ChildItem C:\Work -File -Recurse |
Sort-Object -Property Length -Descending |
Select-Object -First 20 FullName, @{Name="SizeMB"; Expression={ [math]::Round($_.Length / 1MB, 2) }}
ディスク容量調査でよく使います。
直近24時間に更新されたファイルを見る
$since = (Get-Date).AddHours(-24)
Get-ChildItem C:\Work -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-Object FullName, Length, LastWriteTime
障害発生後に、どのファイルが更新されたか見るときに使えます。
ERROR を含むログ行を CSV にする
Select-String -Path C:\App\Logs\*.log -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8
調査結果を共有しやすくなります。
ERROR の前後2行を見る
Select-String -Path C:\App\Logs\*.log -Pattern "ERROR" -Context 2
原因の前後関係を見たいときに使います。
メモリ使用量の大きいプロセスを見る
Get-Process |
Sort-Object -Property WorkingSet -Descending |
Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}
自動起動なのに止まっているサービスを見る
Get-Service |
Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
Select-Object Name, DisplayName, Status, StartType
システムログのエラーを CSV にする
Get-WinEvent -LogName System -MaxEvents 500 |
Where-Object { $_.LevelDisplayName -eq "Error" } |
Select-Object TimeCreated, ProviderName, Id, Message |
Export-Csv .\system-errors.csv -NoTypeInformation -Encoding UTF8
コマンド結果をクリップボードへ送る
Get-Service |
Select-Object Name, DisplayName, Status |
ConvertTo-Csv -NoTypeInformation |
Set-Clipboard
メールやチャットへ貼るときに便利です。
作業前後のファイル一覧を比較する
Get-ChildItem C:\Work -File |
Select-Object -ExpandProperty Name |
Set-Content .\before.txt -Encoding UTF8
作業後にもう一度取ります。
Get-ChildItem C:\Work -File |
Select-Object -ExpandProperty Name |
Set-Content .\after.txt -Encoding UTF8
比較します。
Compare-Object (Get-Content .\before.txt) (Get-Content .\after.txt)
フォルダーの合計サイズを GB で見る
$size = Get-ChildItem C:\Work -File -Recurse |
Measure-Object -Property Length -Sum
[math]::Round($size.Sum / 1GB, 2)
34. 変更系コマンドと組み合わせるときの注意
ここまでの多くは読み取り系です。
読み取り系だけなら、比較的気軽に試せます。
一方で、次のようなコマンドは変更系です。
| 操作 | コマンド |
|---|---|
| コピー | Copy-Item |
| 移動 | Move-Item |
| 削除 | Remove-Item |
| 名前変更 | Rename-Item |
| プロセス停止 | Stop-Process |
| サービス再起動 | Restart-Service |
| 環境変数の永続設定 | [Environment]::SetEnvironmentVariable() |
変更系は、次の順番で使います。
1. Get 系で対象を見る
2. Where-Object で絞る
3. Select-Object で対象一覧を見る
4. Measure-Object で件数を数える
5. 必要なら Export-Csv で残す
6. -WhatIf が使える場合は予行する
7. 実行する
たとえば、古い .tmp ファイルを削除する場合です。
まず対象を見ます。
$limit = (Get-Date).AddDays(-30)
$targets = Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
$targets |
Select-Object FullName, Length, LastWriteTime
件数を数えます。
$targets | Measure-Object
CSV に残します。
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\delete-targets.csv -NoTypeInformation -Encoding UTF8
削除予定を確認します。
$targets | Remove-Item -WhatIf
問題なければ実行します。
$targets | Remove-Item
この流れを守るだけで、事故はかなり減らせます。
35. 覚え方
コマンドを個別に暗記しようとすると大変です。
目的ごとに覚える方が使いやすくなります。
| 目的 | 思い出すコマンド |
|---|---|
| 数えたい | Measure-Object |
| 合計したい | Measure-Object -Sum |
| 種類ごとに見たい | Group-Object |
| 重複を消したい | Sort-Object -Unique |
| 必要な値だけ欲しい | Select-Object -ExpandProperty |
| 列を整えたい | Select-Object |
| 大きい順に見たい | Sort-Object -Descending |
| 文字列を探したい | Select-String |
| 前後を見たい | Select-String -Context |
| 2つを比べたい | Compare-Object |
| 証跡を残したい | Export-Csv / Start-Transcript |
| 画面にもファイルにも出したい | Tee-Object |
| クリップボードに送りたい | Set-Clipboard |
| 時間を測りたい | Measure-Command |
| エラーを詳しく見たい | Get-Error |
36. まとめ
PowerShell は、スクリプトを書けるようになると強力です。
ただし、実務で一番よく使うのは、意外と小さなコマンドの組み合わせです。
数える
並べる
まとめる
比べる
探す
抜き出す
保存する
クリップボードへ送る
作業ログを残す
これらができるだけで、日常作業はかなり楽になります。
最初から難しい自動化を目指す必要はありません。
まずは読み取り系のコマンドで、状況を正確に見られるようにします。
そのうえで、必要なときだけ Copy-Item、Move-Item、Remove-Item、Restart-Service などの変更系コマンドを使います。
PowerShell を安全に使うコツは、次の順番です。
見る → 数える → 整える → 残す → 予行する → 実行する
この型を身につけると、PowerShell は「黒い画面でコマンドを打つもの」ではなく、日々の調査、整理、報告を支える実用的な道具になります。
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
PowerShellコマンドの基本 ── まず覚える操作と安全な使い方
PowerShell初心者が実務で迷わないように、コマンドレットの探し方、パイプライン、ファイル操作、CSV処理、実行ポリシー、事故を避ける確認手順までを整理します。
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 制約を抱える既存資産の活用と移行を支援します。