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

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

更新履歴(3件・最終更新 2026年08月02日)

この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。

記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
フラットに並んでいたレシピを目的別に分類した地図の表を追加し、章番号との対応を付けました。あわせて前の記事との違いの整理、いくつかのレシピの出力例と使いどころ、1ページのチートシートを追加しています。
初版公開
この記事を引用する(DOI: 10.5281/zenodo.21589824)

この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。

小村 豪(2026)「PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす」合同会社小村ソフト. https://doi.org/10.5281/zenodo.21589824 https://staging.comcomponent.com/blog/2026/06/01/002-powershell-practical-command-recipes/

DOI(最新版)
10.5281/zenodo.21589824
DOI(この版)
10.5281/zenodo.21732837

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

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

ここでいう小さな機能とは、短いエイリアスのことではありません。この記事では、lscat のような省略形ではなく、Get-ChildItemGet-ContentSelect-String のような正式なコマンド名を使います。

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

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

PowerShell は、長いスクリプトを書かなくても便利です。まずは「よく使う部品」を増やして、日常作業の中で少しずつ組み合わせられるようにしていきます。

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

なお、この記事に登場するコードは、章立てに沿ってテーマ別に整理した実行できるサンプル一式(レシピスクリプトと Pester テスト)として GitHub で公開しています。

powershell-practical-command-recipes - komurasoft-blog-samples (GitHub)

前の記事との違い

この記事は PowerShellコマンドの基本 ── まず覚える操作と安全な使い方 の続きです。役割は次のように分けています。

  PowerShellコマンドの基本 この記事
ねらい PowerShell を触れるようになる 取り出した結果を、数える・まとめる・比べる・残せるようになる
中心 文法とパイプライン、コマンドの探し方 集計、比較、抽出、出力の部品
CSV / JSON 読み書きの基本 読み込んだ結果を条件で絞って集計する側
プロセス / サービス / イベントログ 一覧を取得する基本 取得した一覧を種類ごとに数え、差分を取る側
変更系コマンド 安全に実行する順番そのもの その順番に組み込む調査・証跡のコマンド

つまり、前の記事が「値を取り出せるようにする」ところまでで、この記事は「取り出した値をどう扱うか」です。

Get-ChildItemGet-ContentImport-CsvGet-Service のような取得コマンドの基本や、実行ポリシー、.ps1 の書き方、エラー処理は前の記事にあります。この記事では、それらを前提にして先へ進みます。Format 系を最後に使うことや Export-Csv -Encoding UTF8 のように、両方に出てくる話もありますが、この記事では「集計や比較に持ち込むときにどうするか」という角度で扱います。

この記事の知識マップ

この記事は、Measure-Object・Select-Object・Sort-Object・Group-Object・Compare-Objectなど、PowerShellの読み取り系コマンドレットを使って結果を数える・重複を消す・種類ごとにまとめる・比べる実務レシピを整理する。Format-Tableは画面表示専用のオブジェクトを返すため、Export-Csvや後続コマンドへ渡す前に使うと出力が壊れるとし、CSVに出すときは列を選ぶSelect-Objectを使うべきだとしている。Remove-Itemのような変更系コマンドについては、対象をGet系コマンドで見る、Measure-Objectで件数を数える、Export-Csvで証跡を残す、-WhatIfで予行するという順番を踏んでから実行することを、事故を減らす安全な運用として勧めている。

PowerShell実用コマンド集の知識マップPowerShellの読み取り系コマンドレット群が集計・整形・比較・証跡の各役割で結びつき、Format-Tableが表示専用であること、変更系コマンドが確認・集計・証跡・予行を経てから実行されるべきことを示す図。利用する利用する利用する利用する利用する利用する利用する利用する利用する利用する利用する利用するの後継利用する利用する利用する利用するより先に行うべき用いるのは非推奨より先に行うべきより先に行うべきより先に行うべきより先に行うべき前提とする前提とする前提とするPowerShell安全な変更操作の手順(見る→数える→整える→残す→予行する→実行する)Measure-ObjectSelect-ObjectSort-ObjectGroup-ObjectSelect-StringCompare-ObjectGet-FileHashTee-ObjectStart-TranscriptExport-CsvInvoke-RestMethodMeasure-CommandPowerShell 7Get-ErrorTest-NetConnectionGet-WinEventRemove-ItemFormat-Table/Format-List-WhatIfパラメーター

図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全26件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle

2. 今回の考え方

前提は、次の3つです。

  1. コマンド名は正式名で書く
  2. 読み取り系のコマンドを中心にする
  3. 変更系のコマンドは、必ず対象確認や -WhatIf と一緒に考える

たとえば、ファイルを削除するコマンドをいきなり覚えるよりも、先に次の流れを身につける方が安全です。

対象を見る
  → 条件で絞る
  → 件数を数える
  → 必要なら CSV に残す
  → 変更予定を確認する
  → 実行する

この記事では、削除や停止のような強い操作よりも、調査・集計・比較・出力を中心に扱います。

3. よく使うコマンドの地図

今回使う主なコマンドです。右端に、詳しく扱う章を入れてあります。

やりたいこと コマンド
件数や合計を調べる Measure-Object 4、5
必要な値だけ取り出す Select-Object -ExpandProperty 6
重複を整理する Sort-Object -Unique 7
種類ごとに集計する Group-Object 8
必要な列だけ出す・計算列を作る Select-Object 9
並べ替える Sort-Object 10
文字列を検索する Select-String 12
2つの結果を比較する Compare-Object 14
ハッシュ値を計算する Get-FileHash 15
クリップボードを使う Set-Clipboard / Get-Clipboard 16
画面とファイルの両方に出す Tee-Object 17
作業ログを残す Start-Transcript 18
ネットワーク疎通を確認する Test-Connection / Test-NetConnection 26
処理時間を測る Measure-Command 28
エラー詳細を見る Get-Error 31
各要素を処理する ForEach-Object 各章で随時

全部を一度に覚える必要はありません。「数えるなら Measure-Object」「まとめるなら Group-Object」「比べるなら Compare-Object」のように、目的とセットで覚えるのがおすすめです。

目的別の章の地図

4 章から 36 章までは、次のかたまりに分かれています。読みたいところから読んでください。

カテゴリ 扱うこと
集計・整形 4〜11 件数、合計、最大・平均、値の取り出し、重複除去、種類別集計、計算列、並べ替え、Format 系の位置づけ
テキスト・ログ調査 12〜14 文字列の検索と前後行、置換、2つの一覧の比較
ファイル・データの中身 15、19、20 ハッシュ値の確認、CSV の絞り込み、JSON の設定値
出力・証跡 16〜18 クリップボードへ送る、画面とファイルの同時出力、作業ログ
システム調査 21〜25、31 環境変数、プロファイル、プロセス、サービス、イベントログ、エラーの詳細
ネットワーク 26、27 疎通確認、Web の応答
実行のしかた 28〜30 実行時間の計測、バックグラウンド実行、コマンド履歴
文法の確認 32 比較演算子
そのまま使えるレシピ 33、34 11個の実務レシピと、変更系コマンドと組み合わせるときの注意
早見表 35 目的から思い出すためのチートシート

「調べたいことは決まっているが、どのコマンドか思い出せない」という状態なら、35 章の早見表から入るのが最短です。

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-ProcessCPU は使用率ではなく、プロセス起動以降に使った CPU 時間の秒数です。

Get-Process |
  Measure-Object -Property CPU -Sum

ただし、この値は瞬間的な CPU 使用率ではなく累積値なので、実行タイミングやプロセスの稼働時間によって変わります。

調査用として見る場合は十分ですが、厳密な監視をしたい場合は専用の監視ツールやログの設計も必要です。

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

出力はこの形になります。件数と拡張子はフォルダーの中身によって変わりますが、列の並びは同じです。

Count Name
----- ----
   42 .log
   18 .csv
    7 .txt
    3

Name が空の行は、拡張子のないファイルです。

-NoElement を外すと、Group という列が増え、そのグループに入った要素そのものが表示されます。

Count Name  Group
----- ----  -----
   42 .log  {app-20260601.log, app-20260602.log, app-20260603.log...}
   18 .csv  {export-01.csv, export-02.csv, export-03.csv...}

件数だけを見たいときに Group 列があると画面が埋まるので、-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つの一覧の違いを見るコマンドです。

いつ使うか: 作業前後で構成が変わっていないかを確認するとき、2台のPCで設定やインストール済みソフトの一覧を突き合わせるとき、本番と検証でサービス構成を比べるときに使います。「変わっていないはず」を確かめる用途で効きます。

たとえば、変更前後のファイル名一覧を比較します。

Compare-Object `
  -ReferenceObject (Get-Content .\before.txt) `
  -DifferenceObject (Get-Content .\after.txt)

before.txta.logb.logc.log が、after.txtb.logc.logd.log が入っていた場合、出力はこうなります。

InputObject SideIndicator
----------- -------------
d.log       =>
a.log       <=

両方にある b.logc.log は、既定では表示されません。表示されるのは違いだけです。

SideIndicator の意味は次の通りです。

表示 意味
<= 左側、つまり ReferenceObject にだけある
=> 右側、つまり DifferenceObject にだけある
== 両方にある。-IncludeEqual を付けた場合に表示される

矢印の向きは、ReferenceObject(左)と DifferenceObject(右)のどちら側に寄っているか、と読むと覚えやすくなります。上の例なら、a.log は左(変更前)にしかないので消えたファイル、d.log は右(変更後)にしかないので増えたファイルです。

フォルダーのファイル名一覧を保存して比較する例です。

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

いつ使うか: 調査結果をそのまま問い合わせの返信や障害報告に貼るとき、Excel に貼って表にするときに使います。ファイルを作って開いて選択してコピー、という手順が丸ごと省けます。

コマンド結果をメールやチャットに貼りたいとき、クリップボードへ送ると便利です。

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

1ページのチートシート

印刷して手元に置く用に、書き方まで入れた早見表にします。ここだけで日常作業の大半は組み立てられます。

目的 そのまま使える形
ファイル数を数える Get-ChildItem . -File \| Measure-Object
合計サイズを GB で見る [math]::Round((Get-ChildItem . -File -Recurse \| Measure-Object -Property Length -Sum).Sum / 1GB, 2)
拡張子ごとの件数 Get-ChildItem . -File \| Group-Object -Property Extension -NoElement \| Sort-Object -Property Count -Descending
大きいファイル上位20件 Get-ChildItem . -File -Recurse \| Sort-Object Length -Descending \| Select-Object -First 20 FullName, Length
直近24時間に更新されたもの Get-ChildItem . -File -Recurse \| Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) }
値だけ取り出す Get-Service \| Select-Object -ExpandProperty Name
重複を消す Get-Content .\list.txt \| Sort-Object -Unique
ログから ERROR を探す Select-String -Path .\logs\*.log -Pattern "ERROR"
ERROR の前後2行を見る Select-String -Path .\logs\*.log -Pattern "ERROR" -Context 2
2つの一覧を比べる Compare-Object -ReferenceObject (Get-Content .\before.txt) -DifferenceObject (Get-Content .\after.txt)
ハッシュ値を確認する Get-FileHash .\installer.exe -Algorithm SHA256
結果をクリップボードへ Get-Service \| Select-Object Name, Status \| ConvertTo-Csv -NoTypeInformation \| Set-Clipboard
画面にもファイルにも出す Get-Process \| Tee-Object -FilePath .\out.txt
作業ログを取り始める Start-Transcript -Path .\work.log
CSV を条件で絞る Import-Csv .\data.csv \| Where-Object { $_.Status -eq "NG" }
CSV に残す ... \| Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8
メモリの大きいプロセス Get-Process \| Sort-Object WorkingSet -Descending \| Select-Object -First 10 Name, Id, WorkingSet
止まっている自動起動サービス Get-Service \| Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" }
イベントログのエラー Get-WinEvent -LogName System -MaxEvents 200 \| Where-Object { $_.LevelDisplayName -eq "Error" }
疎通を確認する Test-NetConnection -ComputerName example.local -Port 443
実行時間を測る Measure-Command { ... }
直前のエラーを詳しく見る Get-Error

忘れてはいけない順番

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

Format-TableFormat-List は、この流れの一番最後、画面で見るときだけに使います。Export-Csv や次のコマンドへ渡す前に挟むと、そこから先が壊れます。

36. まとめ

PowerShell は、スクリプトを書けるようになると強力です。ただし、実務で一番よく使うのは、意外と小さなコマンドの組み合わせです。

数える
並べる
まとめる
比べる
探す
抜き出す
保存する
クリップボードへ送る
作業ログを残す

これらができるだけで、日常作業はかなり楽になります。最初から難しい自動化を目指す必要はありません。 まずは読み取り系のコマンドで状況を正確に見られるようにして、そのうえで、必要なときだけ Copy-ItemMove-ItemRemove-ItemRestart-Service などの変更系コマンドを使います。

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

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

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

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

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

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

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

PowerShellでファイルの件数や合計サイズを調べるにはどうすればよいですか?
Get-ChildItemの結果をMeasure-Objectにパイプします。件数は結果のCountプロパティで確認でき、サブフォルダーも含める場合は-Recurseを付けます。合計サイズはMeasure-Object -Property Length -Sumで集計し、バイト数のままだと読みにくいので[math]::Round($size.Sum / 1GB, 2)のようにGB単位へ変換すると見やすくなります。-Averageや-Maximumを付ければ平均値・最大値も一度に出せます。
Select-Objectの-ExpandPropertyは通常の指定と何が違いますか?
Select-Object Nameは「Nameという列を持つ表(オブジェクト)」を返しますが、Select-Object -ExpandProperty Nameは「Nameの値そのもの」を返します。CSVに出力したいときは列として残す通常の指定が向いており、別のコマンドや文字列処理、テキストファイルへ値だけを渡したいときは-ExpandPropertyが扱いやすいです。目的によって使い分けます。
Format-TableをExport-Csvの前に使ってはいけないのはなぜですか?
Format-TableやFormat-Listは画面表示用のコマンドで、出力が表示用オブジェクトに変わってしまうため、その後のCSV出力や加工が正しく行えなくなるからです。CSVに出す場合や次のコマンドで加工する場合は、Select-Objectで列を選んでからExport-Csvに渡します。「画面で見るだけならFormat系、後で使うならSelect-Object」と覚えると迷いません。
Remove-Itemなどの変更系コマンドを安全に使う手順はありますか?
いきなり実行せず、まずGet系コマンドで対象を見て、Where-Objectで絞り、Select-Objectで対象一覧を確認し、Measure-Objectで件数を数え、必要ならExport-Csvで証跡を残します。そのうえで-WhatIfが使えるコマンドなら予行して削除・移動の予定を確認し、問題なければ実行します。この順番を守るだけで事故はかなり減らせます。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る