PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす

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

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

PowerShell の基本を覚えたら、次は「よく使う小さな機能」を増やしていくと実務で使いやすくなります。

ここでいう小さな機能とは、短いエイリアスのことではありません。

この記事では、lscat のような省略形ではなく、Get-ChildItemGet-ContentSelect-String のような正式なコマンド名を使います。

そのうえで、次のような作業を、1行または数行のコマンドでできるようにします。

件数を数える
合計サイズを調べる
重複を消す
種類ごとに集計する
必要な値だけ取り出す
2つの結果を比較する
ログの前後行を見る
クリップボードへ送る
実行結果を保存しながら画面にも出す
環境変数やネットワークを確認する

PowerShell は、長いスクリプトを書かなくても便利です。

まずは「よく使う部品」を増やして、日常作業の中で少しずつ組み合わせられるようにしていきます。

コマンドを暗記するよりも、「こういう時はこの部品が使える」と思い出せることが大事です。

2. 今回の考え方

前提は、次の3つです。

  1. コマンド名は正式名で書く
  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 NameSelect-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-TableFormat-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-TableFormat-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-ObjectWhere-Object と組み合わせやすくなります。

社内 API を調べる場合も、まずは読み取り系の GET から始めます。

認証情報やトークンを扱う場合は、画面表示や transcript への記録に注意します。

28. 実行時間を測る ── Measure-Command

処理にどれくらい時間がかかるか知りたいときは Measure-Command を使います。

Measure-Command {
  Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
    Measure-Object
}

結果には TotalSecondsTotalMilliseconds が含まれます。

$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-ItemStop-Process のような変更系コマンドを履歴から再実行するときは、内容を確認してから実行します。

31. エラーの詳細を見る ── Get-Error

PowerShell 7 では、直近のエラーを詳しく見るために Get-Error が使えます。

Get-Error

直近のエラーメッセージだけ見たい場合です。

$Error[0].Exception.Message

エラーが発生したときは、画面の赤い文字だけを見るのではなく、次の点を確認します。

どのコマンドで失敗したか
どのパスや対象で失敗したか
権限の問題か
ファイルが存在しないのか
ネットワークやロックの問題か

調査結果を残したい場合は、Start-TranscriptExport-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-ItemMove-ItemRemove-ItemRestart-Service などの変更系コマンドを使います。

PowerShell を安全に使うコツは、次の順番です。

見る → 数える → 整える → 残す → 予行する → 実行する

この型を身につけると、PowerShell は「黒い画面でコマンドを打つもの」ではなく、日々の調査、整理、報告を支える実用的な道具になります。

関連する記事

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

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

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

記事を読む

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

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

記事を読む

関連トピック

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

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

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

ブログ一覧に戻る