更新履歴(3件・最終更新 2026年08月02日)
この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。
- 記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
- 外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
- フラットに並んでいたレシピを目的別に分類した地図の表を追加し、章番号との対応を付けました。あわせて前の記事との違いの整理、いくつかのレシピの出力例と使いどころ、1ページのチートシートを追加しています。
- 初版公開
この記事を引用する(DOI(登録済みアーカイブ): 10.5281/zenodo.21589824)
以下のDOIは過去に登録されたアーカイブを指しており、現在の本文とは一致しない場合があります。現在の本文を参照するときは、このページのURLを使用してください。
小村 豪(2026)「PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす」合同会社小村ソフト. https://comcomponent.com/blog/2026/06/01/002-powershell-practical-command-recipes/
- DOI(登録済みアーカイブ)
- 10.5281/zenodo.21589824
- DOI(前回登録した版)
- 10.5281/zenodo.21732837
1. 最初に押さえるべきこと
PowerShell の基本を覚えたら、次は「取り出した結果を、数える・まとめる・比べる・残す」ための部品を増やすと、日常作業で使いやすくなります。この記事は、そのためのコマンドと短い実務レシピをまとめたものです。
全部を順番に覚える必要はありません。やりたい作業から探すなら3章の目的別索引、組み合わせた例を使うなら33章の実務レシピ、書き方を思い出すだけなら35章のチートシートへ進んでください。削除・停止・設定変更を行う場合は、先に2章の考え方と34章の確認手順を押さえます。
ここでいう小さな機能とは、短いエイリアスのことではありません。この記事では、ls や cat のような省略形ではなく、Get-ChildItem、Get-Content、Select-String のような正式なコマンド名を使います。
そのうえで、次のような作業を、1行または数行のコマンドでできるようにします。
件数を数える
合計サイズを調べる
重複を消す
種類ごとに集計する
必要な値だけ取り出す
2つの結果を比較する
ログの前後行を見る
クリップボードへ送る
実行結果を保存しながら画面にも出す
環境変数やネットワークを確認する
PowerShell は、長いスクリプトを書かなくても便利です。まずは「よく使う部品」を増やして、日常作業の中で少しずつ組み合わせられるようにしていきます。
コマンドを暗記するよりも、「こういう時はこの部品が使える」と思い出せることが大事です。
なお、この記事に登場するコードは、章立てに沿ってテーマ別に整理した実行できるサンプル一式(レシピスクリプトと Pester テスト)として GitHub で公開しています。
powershell-practical-command-recipes - komurasoft-blog-samples (GitHub)
前の記事との違い
この記事は PowerShellコマンドの基本 ── まず覚える操作と安全な使い方 の続きです。役割は次のように分けています。
| PowerShellコマンドの基本 | この記事 | |
|---|---|---|
| ねらい | PowerShell を触れるようになる | 取り出した結果を、数える・まとめる・比べる・残せるようになる |
| 中心 | 文法とパイプライン、コマンドの探し方 | 集計、比較、抽出、出力の部品 |
| CSV / JSON | 読み書きの基本 | 読み込んだ結果を条件で絞って集計する側 |
| プロセス / サービス / イベントログ | 一覧を取得する基本 | 取得した一覧を種類ごとに数え、差分を取る側 |
| 変更系コマンド | 安全に実行する順番そのもの | その順番に組み込む調査・証跡のコマンド |
つまり、前の記事が「値を取り出せるようにする」ところまでで、この記事は「取り出した値をどう扱うか」です。
Get-ChildItem、Get-Content、Import-Csv、Get-Service のような取得コマンドの基本や、実行ポリシー、.ps1 の書き方、エラー処理は前の記事にあります。この記事では、それらを前提にして先へ進みます。Format 系を最後に使うことや Export-Csv -Encoding UTF8 のように、両方に出てくる話もありますが、この記事では「集計や比較に持ち込むときにどうするか」という角度で扱います。
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全26件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
2. 今回の考え方
このページは、先頭からすべてのコードを連続実行する手順書ではありません。 目的に合うレシピを選び、対象と出力先を確認しながら使います。前提は、次の3つです。
- コマンド名は正式名で書く
- 読み取り系のコマンドを中心にする
- 変更系のコマンドは、必ず対象確認や
-WhatIfと一緒に考える
変更する前に、読み取り系で確かめる
たとえば、ファイルを削除するコマンドをいきなり覚えるよりも、先に次の流れを身につける方が安全です。
対象を見る
→ 条件で絞る
→ 件数を数える
→ 必要なら CSV に残す
→ 変更予定を確認する
→ 実行する
この記事では、削除や停止のような強い操作よりも、調査・集計・比較・出力を中心に扱います。コード中のパスやファイル名は、調べたい対象と保存先に合わせて読み替えてください。
次に渡す「結果の形」で選ぶ
同じ一覧でも、次に何をしたいかで使うコマンドが変わります。6章と11章で詳しく扱う違いを、先に整理しておきます。
| 次にしたいこと | 結果の形と使う部品 |
|---|---|
| 件数や合計を知る | Measure-Object で集計し、Count や Sum を見る |
| 名前などの値だけを渡す | Select-Object -ExpandProperty で値そのものを取り出す |
| 列を持つデータとして加工・保存する | Select-Object で列を選び、CSV なら Export-Csv へ渡す |
| 画面で見やすくする | Format-Table / Format-List を最後に使う |
画面用の整形と、後で加工できるデータの出力は別です。 CSV に出す前に Format 系を挟まないことが、レシピを組み合わせるときの要点です。
3. よく使うコマンドの地図
目的別の章の地図
4〜35章のレシピと早見表を、目的別に整理しています。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章の早見表から入るのが最短です。
コマンド名から探す
コマンド名から探す場合はこちらです。右端の章で、出力の読み方と組み合わせ方を説明しています。
| やりたいこと | コマンド | 章 |
|---|---|---|
| 件数や合計を調べる | 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. 件数を数える ── Measure-Object
まずよく使うのが、件数を数える操作です。
件数は Count を読む
現在のフォルダーにあるファイル数を数えます。
Get-ChildItem . -File | Measure-Object
サブフォルダーも含めて数える場合です。
Get-ChildItem . -File -Recurse | Measure-Object
Measure-Object の結果にある Count が件数です。
合計サイズは Length を集計する
ファイルサイズの合計を見たい場合は、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 使用率と累積時間を混同しない
プロセスの累積 CPU 時間を合計することもできます。Get-Process の CPU は使用率ではなく、プロセス起動以降に使った 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 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 を使います。
Count と Name で分布を見る
拡張子ごとにファイル数を数えます。
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-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 *
CSV や次のコマンドへ渡す場合
ただし、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 に残す
検索結果を 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$", ""
ファイルは「検索 → 別ファイルに出力 → 確認」の順に扱う
設定ファイルや一括置換では、置換対象が多すぎると事故になります。先に Select-String で対象を確認してから置換すると安全です。
Select-String -Path .\appsettings.json -Pattern "localhost" -SimpleMatch
ファイルの中身を置き換える場合は、いきなり元ファイルに上書きしない方が安全です。対象を確認したら、まず別ファイルに出します。
(Get-Content .\appsettings.json -Raw) -replace "localhost", "db01" |
Set-Content .\appsettings.preview.json -Encoding UTF8
確認してから、必要なら元ファイルへ反映します。
14. 2つの結果を比較する ── Compare-Object
Compare-Object は、2つの一覧の違いを見るコマンドです。
いつ使うか: 作業前後で構成が変わっていないかを確認するとき、2台のPCで設定やインストール済みソフトの一覧を突き合わせるとき、本番と検証でサービス構成を比べるときに使います。「変わっていないはず」を確かめる用途で効きます。
変更前と変更後を左右に対応させる
たとえば、変更前後のファイル名一覧を比較します。
Compare-Object `
-ReferenceObject (Get-Content .\before.txt) `
-DifferenceObject (Get-Content .\after.txt)
before.txt に a.log、b.log、c.log が、after.txt に b.log、c.log、d.log が入っていた場合、出力はこうなります。
InputObject SideIndicator
----------- -------------
d.log =>
a.log <=
両方にある b.log と c.log は、既定では表示されません。表示されるのは違いだけです。
SideIndicator の読み方
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
ここからは対象の作業を終えた後に実行します。 変更後の状態を、別の CSV に出します。
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 向けにタブ区切りにする
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方向に流します。
画面に出す
ファイルにも保存する
表データを残したいなら Export-Csv
調査中に「見ながら記録する」用途に向いています。ただし、後で 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 を使うと、作業メモを取り忘れたときの保険になります。結果の表だけを保存したい場合は Export-Csv、一連の操作を記録したい場合は 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 に保存する
有効なユーザーだけを別 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 でよく使われます。
読み込んで、必要な値を取り出す
JSON を扱うときは、Get-Content -Raw を使うことが多いです。-Raw を付けるとファイル全体を1つの文字列として読み込むので、複数行の JSON を扱うときはこの方が分かりやすくなります。
$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
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
存在しない場合だけ、新しく作成する
上の Test-Path が False で、プロファイルが存在しない場合に作成します。すでに存在する場合は作成コマンドを飛ばし、次のメモ帳で開く操作へ進んでください。 New-Item -Force は既存ファイルを上書きするためです。1
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
表示名でエラーと警告を絞る
以下の例は、LevelDisplayName が Error / Warning という表記の環境を前提にしています。まず上の一覧で、自分の環境に表示される値を確認してください。表記が異なる場合は、比較する文字列もその値に合わせます。LevelDisplayName はイベントのレベルの表示名です。2
エラーと警告だけに絞ります。
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. ネットワークを確認する
疎通・TCP ポート・名前解決を確認する
疎通確認には 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 ページの応答を見る
Web ページの取得には Invoke-WebRequest を使います。
Invoke-WebRequest https://example.com |
Select-Object StatusCode, StatusDescription
JSON API の結果を加工する
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回の測定だけで判断しない
スクリプトを速くしたいときは、感覚ではなく時間を測るのが大事です。ただし、ファイル数、ディスク状態、ネットワーク状態によって結果は変わるので、1回の結果だけで判断せず、何度か確認します。
29. 時間のかかる処理を裏で動かす ── Start-Job
いつ使うか: 大きなフォルダーの全件走査やハッシュ計算のように数分かかる処理を流しつつ、その間に別の調査を進めたいときに使います。逆に、数秒で終わる処理をジョブ化しても、起動の手間の方が大きくなります。
ジョブを開始する
時間がかかる調査を、別ジョブとして実行したい場合は Start-Job を使います。
$job = Start-Job -ScriptBlock {
Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
Measure-Object
}
状態を確認してから、結果を受け取る
ジョブの状態を見ます。
Get-Job
この例では、対象ジョブの State が Completed になったことを確認してから結果を受け取ります。Receive-Job はその時点で利用できる結果を取得するコマンドなので、実行中の受け取りを「すべて終わった」と読み替えないようにします。3
Receive-Job $job
結果を確認した後で後始末する
完了したジョブの結果を受け取り、不要になったジョブを削除します。
Remove-Job $job
Start-Job は便利ですが、最初から多用する必要はありません。まずは普通に実行し、時間がかかる処理だけジョブ化すると分かりやすくなります。
30. コマンド履歴を使う
いつ使うか: 試行錯誤しながら組み立てたコマンドを、うまくいったあとで手順書やスクリプトに写すときに使います。
履歴を確認する
過去に実行したコマンドを見るには Get-History を使います。
Get-History
コマンド行だけ見やすくします。
Get-History |
Select-Object Id, CommandLine
内容を確認した履歴だけ再実行する
Invoke-History は表示ではなく再実行です。Remove-Item や Stop-Process のような変更系コマンドでないか、履歴の内容を確認してから使います。 特定の履歴を再実行する例です。
Invoke-History 12
履歴は、うまくいったコマンドを手順書やスクリプトに写すためにも使えます。再実行と、記録の取り出しを分けて考えてください。
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. ちょっとした実務レシピ
ここからは、実務でそのまま使いやすい形の例です。11個の独立したレシピなので、必要なものを選んで使います。 ファイル・ログ・プロセスやサービス・結果の共有と比較、という順に並んでいます。
パスと出力先を確認し、コマンドの意味を確かめたいときは3章の索引へ戻ってください。イベントログの文字列による絞り込みは25章の表示名の注意、削除や停止と組み合わせる場合は34章も確認します。
拡張子ごとのファイル数を見る
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-Error は31章で説明した PowerShell 7 のコマンドです。イベントログの表示名は25章、記録に機密を混ぜないための注意は18章を参照してください。
| 目的 | そのまま使える形 |
|---|---|
| ファイル数を数える | 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-Table と Format-List は、この流れの一番最後、画面で見るときだけに使います。Export-Csv や次のコマンドへ渡す前に挟むと、そこから先が壊れます。
36. まとめ
PowerShell は、スクリプトを書けるようになると強力です。ただし、実務で一番よく使うのは、意外と小さなコマンドの組み合わせです。
数える
並べる
まとめる
比べる
探す
抜き出す
保存する
クリップボードへ送る
作業ログを残す
これらができるだけで、日常作業はかなり楽になります。最初から難しい自動化を目指す必要はありません。
まずは読み取り系のコマンドで状況を正確に見られるようにして、そのうえで、必要なときだけ Copy-Item、Move-Item、Remove-Item、Restart-Service などの変更系コマンドを使います。
PowerShell を安全に使うコツは、次の順番です。
見る → 数える → 整える → 残す → 予行する → 実行する
この型を身につけると、PowerShell は「黒い画面でコマンドを打つもの」ではなく、日々の調査、整理、報告を支える実用的な道具になります。
参考リンク
-
Microsoft Learn, New-Item. プロファイルの作成例と、
-Forceで既存ファイルを上書きする動作について。 ↩ -
Microsoft Learn, EventLogRecord.LevelDisplayName. イベントレベルの表示名を取得するプロパティについて。 ↩
-
Microsoft Learn, Receive-Job. その時点で取得できるジョブの結果を受け取る動作について。 ↩
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
PowerShellスクリプトの引数設計とモジュール化 ── 「動くスクリプト」から「人に渡せるスクリプト」へ
PowerShellスクリプトを他人に渡せる品質に引き上げる手順を整理します。paramブロックと[CmdletBinding()]、入力検証、パイプライン入力、-WhatIf対応、.psm1モジュール化、社内共有とGit管理の勘所まで解説します。
PowerShellからCOMと.NETを呼ぶ実践 ── スクリプトの届く範囲を一気に広げる
PowerShellから.NETクラスを呼ぶ方法、Add-TypeによるC#とWin32 APIの組み込み、COM操作、Excelのプロセス残留と後始末、Officeの無人実行が非サポートである理由、5.1と7の違いまで実務目線で解説します。
PowerShellでExcel・CSV業務処理を自動化する ── 集計・突合・帳票出力の実務レシピ
PowerShellでCSVの集計・突合・Excel帳票出力を自動化する実務レシピ。Import-Csv/Export-Csvの文字コード既定(5.1と7の違い)、Group-Objectの集計、Compare-Objectとハッシュテーブルの突合、ImportExcelと...
PowerShellコマンドの基本 ── まず覚える操作と安全な使い方
PowerShell初心者が実務で迷わないように、コマンドレットの探し方、パイプライン、ファイル操作、CSV処理、実行ポリシー、事故を避ける確認手順までを整理します。
winget + PowerShellでPCキッティングを自動化する ── 手順書を実行可能にする
新入社員PCのセットアップを再現可能にする方法をまとめます。wingetによるアプリ導入とexport/import、WinGet Configurationの宣言的な構成、PowerShellで補う設定、無人実行時の注意点までを解説します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
COM / ActiveX / OCX、32bit / 64bit 制約を抱える既存資産の活用と移行を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- 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が使えるコマンドなら予行して削除・移動の予定を確認し、問題なければ実行します。この順番を守るだけで事故はかなり減らせます。