PowerShell 学習資料 全体構成案

プログラミング経験のある読者を対象にした、本編12章+付録3つのカリキュラム設計

📅 作成: 2026-08-22 / 更新: 2026-08-26 / ステータス: 本編12章 + 付録 A1・A2・A3 完成

1. 全体方針と対象読者

2種類の読者を1つの資料でカバーする

この資料は読者を2種類想定しています。どちらもプログラミングの基礎(変数・条件分岐・繰り返し・関数)は理解している前提です。違いは「その経験が JavaScript かどうか」だけです。

別々の資料を作ると保守が二重になるため、本文は JS 経験者向けに書き、JS 以外の経験者が引っかかる箇所だけ補足枠を添える方式にします。

プログラミング未経験者は対象外とします。
「変数とは」「関数とは」から説明を始めると分量が数倍になり、経験者にとっては冗長な資料になります。読者はすでに何らかの言語を書けるという前提を置くことで、PowerShell 固有の話に集中できます。
読者A — JavaScript 経験者 JS の基本文法を知っている 「JS ではこう書く」の対比が効く 読者B — 他言語の経験者 Java・C#・VBA など JS の例と Windows 用語で詰まる 本文は読者A向け + 「PowerShell が初めての人へ」枠で読者Bを補う 1つの資料を保守すればよい/勉強会では枠を飛ばして進行できる
図 1 — 資料を分けず、補足枠で2種類の読者を吸収する

本文を書くときの4原則

補足枠に書くこと・書かないこと

読者がプログラミングの基礎を持っている前提になったことで、補足枠の中身も絞り込めます。書くのは PowerShell と Windows に固有の事情だけです。

判定内容
書くWindows 固有の用語ANSI、コードページ、WMI、レジストリ、実行ポリシー
書くシェル特有の概念シェルとターミナルの違い、パイプ、リダイレクト、標準出力
書くPowerShell 固有の慣習動詞-名詞の命名規則、Cmdlet、$_、終了/非終了エラー
書くJS の例が読めない読者への言い換え「JS の filter に相当」→「配列から条件に合う要素だけ取り出す処理」
書かないプログラミングの基礎概念変数とは、関数とは、配列とは、条件分岐とは
書かない本文の単なる繰り返し本文で説明済みの内容を言い換えただけの枠
枠の見出しは「PowerShell が初めての人へ」で統一します。
「はじめての人へ」だとプログラミング未経験者向けに読めてしまいます。補うのはPowerShell と Windows の事情であって、プログラミングそのものではないことを見出しで示します。

バージョンバッジの使い方

本資料は Windows PowerShell 5.1 と PowerShell 7 (pwsh) の両方を対象にします。読者の環境がどちらか分からないため、差がある箇所だけをその場でバッジで示します。

バッジ意味使用例
pwsh 7PowerShell 7 以降でのみ使える/挙動が異なる三項演算子 $a ? $b : $cForEach-Object -Parallel、既定が BOM なし UTF-8
5.1Windows PowerShell 5.1 固有の注意点BOM がないと日本語が壊れる、Invoke-WebRequest が IE エンジン依存
(なし)両方で同じように動く大半の内容。バッジを付けない
バッジを付けすぎない。
両方で動く内容にまで付けると、本当に注意が必要な箇所が埋もれます。コピペして動かなかったときに原因がバージョン差だと分かることが目的なので、差がある箇所に限定します。

1ファイルの構成テンプレート

全ファイルで同じ骨格にすることで、読者が「どこに何が書いてあるか」を予測できるようにします。

位置内容目的
冒頭この章で何ができるようになるか(3行)読む前に到達点を示す
各章 (h1)概念 → DOS/JS との対比 → PowerShell の書き方 → 短い実例既知から未知へ橋を架ける
補足枠.callout で「PowerShell が初めての人へ」読者Bの補足。読者Aは飛ばせる
末尾まとめ表 + 次章への導線復習と連続性
この構成案自体もレビュー対象です。
ファイル数・順序・粒度は確定していません。特に「基礎編を5ファイルに分けるか、3ファイルに圧縮するか」は勉強会の回数によって変わります。

2. ファイル構成とロードマップ

全12ファイル・4部構成

第1部 基礎編 01 生まれた経緯 02 ファイル形式と文字コード 03 実行環境と実行ポリシー 04 変数・型・演算子 05 パイプラインとオブジェクト 第2部 実践編 06 制御構文と関数 07 ファイルとテキスト操作 08 エラー処理とデバッグ 09 実務パターン集 第3部 演習 10 ハンズオン課題 と解答例 第4部 発展編 11 C# を埋め込む 12 Office と COM 後から追加した 「読んで分かる」 「書けるようになる」 「一人で作れる」 「限界を超える」 各部の到達目標
図 2 — 4部構成のロードマップと到達目標。第4部は本編を書き終えてから追加した

ファイル一覧

No.タイトル扱う内容章数
01背景DOS/cmd の限界、Bash との比較、PowerShell の設計思想、Node.js との立場の違い4
02ファイル形式BOM の有無で 5.1 と 7 の解釈が逆になる(本資料の最重要点)、CRLF、.ps1.cmd.bat の使い分け、cmd ランチャー4
03実行環境Windows PowerShell 5.1 と PowerShell 7 (pwsh) の違い、実行ポリシー、プロファイル、VS Code4
04変数と型変数・型・演算子・配列・ハッシュテーブル。JS との対比を全節に配置5
05パイプラインオブジェクトパイプ、Where-ObjectForEach-ObjectSelect-Object、Cmdlet の命名規則5
06制御構文と関数ifforeachswitch、関数、パラメータ、スコープ4
07ファイル操作パス操作、Get-ContentSet-Content のエンコーディング、CSV/JSON4
08エラー処理try/catch$ErrorActionPreference、終了コード、デバッグ手順4
09実務パターン集ログ集計、一括リネーム、タスクスケジューラ連携、他プロセス呼び出し5
10ハンズオン勉強会用の課題と解答例、詰まりやすい箇所の解説3
11Add-TypeC# をその場でコンパイルして呼ぶ。P/Invoke、型の再定義制限、csc.exe で exe 化7
12COMとOfficeWord・Excel・PowerPoint の操作と PDF 化、プロセスを残さない後始末5
A1逆引き症状・コマンド名・JavaScript・用語の4つの入口から該当箇所へ引く索引4
A2テンプレ集コピーして使う雛形。スクリプトの骨格・ログ・引数検証・ファイル処理ほか6
A3モジュール業務で使えるモジュール厳選8本。選ぶ基準、導入とオフライン配布4
付録は A1- A2- A3- の記法にします。
本編の 0112順に読む前提ですが、付録は必要になったときに引くものです。番号体系を変えることで、読者が「順番に読まなくてよい」と判断できます。
ファイル名でも 10- の後ろに並ぶため、一覧の見た目も崩れません。

読む順序の依存関係

05「パイプラインとオブジェクト」が本資料の山場です。
ここを理解できるかどうかで、PowerShell を「コマンドの寄せ集め」として使うか「オブジェクト指向シェル」として使えるかが分かれます。勉強会でも最も時間を割く回になります。

3. 基礎編(01〜05)の詳細

01. 背景

DOS/cmd の限界 → Bash の強み → PowerShell が必要だった理由 → 設計思想 → 他言語との立場、の4章構成。SVG図4枚で、テキストパイプとオブジェクトパイプの違いを視覚化済み。

02. ファイル形式と文字コード

この資料で最初に「決まりごと」が出てくる章です。理由を説明せずに規則だけ書くと必ず忘れられるので、文字コードの仕組みから入ります。

内容添える対比
02.1文字コードの基礎 — Shift-JIS、UTF-8、BOM とは何かJS のソースは BOM なし UTF-8 が普通
02.2なぜ ps1 は BOM 付き UTF-8 なのか5.1 は BOM がないと ANSI と誤認する。pwsh 7 は BOM なしでも正しく読むNode.js は BOM なしで問題ない理由
02.3なぜ CRLF なのか — Windows 標準、混在による事故Git の core.autocrlf
02.4.ps1.cmd.bat の使い分けと cmd ランチャーcmd/bat は SJIS + CRLF(ps1 と違う)

02.2 が本資料で最も重要な節

BOM の有無で、5.1 と 7 は同じファイルを別の文字コードとして解釈します。
しかも解釈の仕方が逆方向です。5.1 は「BOM がなければ ANSI(日本語環境では CP932)」と見なし、7 は「BOM がなければ UTF-8」と見なします。この結果、BOM 付き UTF-8 だけが両方で正しく読める唯一の形式になります。これが CLAUDE.md の「ps1 は BOM 付き UTF-8」ルールの根拠です。
ps1 ファイルの保存形式 Windows PowerShell 5.1 の解釈 PowerShell 7 の解釈 UTF-8(BOM 付き) ✓ UTF-8 として読む BOM を見て判定できる ✓ UTF-8 として読む BOM は読み飛ばす UTF-8(BOM なし) ✗ ANSI(CP932)と誤認 日本語が文字化けする ✓ UTF-8 として読む BOM なし=UTF-8 が既定 Shift-JIS(BOM なし) ✓ CP932 として読める 既定が ANSI なので一致する ✗ UTF-8 と誤認 不正バイトとして壊れる 両方で正しく読めるのは「UTF-8(BOM 付き)」だけ
図 3 — 5.1 と 7 は「BOM がない場合」の既定解釈が逆。BOM 付き UTF-8 が唯一の共通解

注意3行目に注目してください。Shift-JIS の ps1 は 5.1 では動くが 7 では壊れます。「今まで動いていたスクリプトが pwsh に変えた途端に文字化けする」典型的な原因がこれです。02.2 ではこの逆転を必ず扱います。

この章は実際に壊して見せると効果的です。
BOM なしの ps1 に日本語を書いて 5.1 で実行し、文字化けを目の前で起こす。さらに同じファイルを 7 で実行して正常に動くことを見せると、上の表が体感として入ります。「規則」が「実害の回避策」に変わります。

03. 実行環境と実行ポリシー

内容添える対比
03.15.1 と 7 の違い、共存の考え方、powershell.exepwsh.exe の使い分け。以降の章で使うバージョンバッジの説明もここで行うNode.js のバージョン共存
03.2実行ポリシー — なぜ既定でスクリプトが動かないのかDOS の bat には無かった概念
03.3プロファイル、モジュールパス、$PSVersionTable.bashrcnode_modules
03.4VS Code での編集・デバッグ環境

04. 変数・型・演算子

読者Aの既知知識に最も接続しやすい章。全節で JS のコードを左、PowerShell を右に並べます。

# JavaScript                    # PowerShell
const name = "PS";              $name = "PS"
const arr = [1, 2, 3];          $arr = @(1, 2, 3)
const obj = { a: 1 };           $obj = @{ a = 1 }
arr.filter(x => x > 1);         $arr | Where-Object { $_ -gt 1 }
`${name} version`;              "$name version"

05. パイプラインとオブジェクト

4. 実践編(06〜09)の詳細

06. 制御構文と関数

06.3 は経験者ほど引っかかります。
JS の return の感覚で書くと、途中の Write-Output や式の評価結果まで戻り値に混ざります。要素1個の配列がスカラーに潰れる問題(return ,$array)もここで扱います。

07. ファイル・テキスト操作

内容注意点
07.1パス操作 — Join-PathResolve-Path、相対パスカレントは .\ を明示
07.2Get-ChildItem — 再帰、フィルタワイルドカードと -Filter の併用で0件になる罠
07.3Get-ContentSet-Content のエンコーディング指定02章の内容がここで効く。5.1pwsh 7-Encoding の既定値が違う
07.4CSV/JSON の読み書きConvertTo-Json の深さ制限

08. エラー処理とデバッグ

09. 実務パターン集

ここまでの知識を組み合わせた「そのまま使える」スクリプト集。各パターンは50行以内に収め、写経できる長さにします。

5. 発展編(11・12)の詳細

本編を書き終えてから足した理由

当初の構成は 01〜10 の3部構成でした。11・12 は本編を一通り書き終えたあとに追加したもので、性格が本編とは違います。

付録にせず本編の章にしたのは、内容が「引く」ものではなく「読む」ものだからです。
A1〜A3 は必要な行だけ拾えば用が足りますが、11・12 は前提から順に読まないと危険な操作(プロセスが残る、型が固定される)を含みます。そのため第4部として本編の続きに置き、README のロードマップでも「必要になってからでよい」と明示しています。

11. C# を埋め込む — Add-Type

全7節。すべてのコードを 5.1 と 7 の両方で実行して確認しています。

実測で「7 のほうが速い」が崩れました。
StringBuilder を PowerShell から回すループは 5.1 が 48〜58ms、pwsh 7 が 191〜200ms で7 が約4倍遅いという結果でした。C# の静的メソッドを1回ずつ呼ぶ形も、30万回で PowerShell のみ 818ms に対し C# 呼び出し 1,809ms と逆に遅くなります。ループごと C# に渡して初めて 4ms になります。
「C# にすれば速い」ではなく「境界をまたぐ回数を減らせば速い」が正しい理解で、11.1 と 11.6 の骨子にしました。

12. Office と COM を操作する

全5節。Word・Excel・PowerPoint の COM を実際に動かして確認しています。

12.5 は自分たちのコードを教材にしています。
src/scripts/pptx/build-pptx.ps1 は資料の pptx を作るために PowerPoint COM を使っており、ExportAsFixedFormat が PowerShell の遅延バインディングで通らず SaveAs で回避した経緯がコメントとして残っていました。資料を作る道具そのものが実例になっています。
なお SaveAs が「名前 2.pptx」を作るという既存コメントだけは再現できず、未再現と明記して載せています。

6. 勉強会の進行案

全5回・1回90分

各回の進行表は受講者が見るものなので README の4章「勉強会で使う場合」 に置いています。ここでは主催する側の準備だけを扱います。

1回あたりの時間配分

前回の復習 10分 資料の読み合わせ・解説 35分 ハンズオン 35分 質疑 10分 解説とハンズオンを同量にする。聞くだけの回にしない
図 4 — 90分の配分。手を動かす時間を解説と同量確保する

事前準備(主催側)

決定事項

以下は確定済みです。
全5回・1回90分で進める
5.1 と 7 の両方を対象にし、差がある箇所に pwsh 7 5.1 のバッジを付ける
③ 読者は何らかのプログラミング言語の基礎を知っている人とし、未経験者は対象外。JS 以外の経験者向けの補足は本文内の .calloutで対応し、別ファイルは作らない

7. 付録(A1・A2・A3)の詳細

本編との役割の違い

本編 01〜10付録 A1・A2
読み方順に読む必要なときに引く
目的理解する思い出す・写す
構成説明 → 図 → 例 → まとめ表とコードが主体

A1. 逆引き — 4つの入口

資料には Cmdlet 76種が12章に散らばっています。「あのコマンドはどの章だったか」を引けるようにします。

引き方内容項目数の目安
A1.1症状から「0 件しか返らない」「文字化けする」「try/catch が効かない」38
A1.2コマンドからCmdlet 名 → 用途と解説箇所。HTML から自動生成する69
A1.3JavaScript からfilterWhere-Object のような対応表28
A1.4用語からCmdlet・BOM・実行ポリシー・非終了エラー等の一言定義25
A1.2 は手書きしません。
69 種 × 10 章の対応表を手で維持すると、章を追加するたびに陳腐化します。src/scripts/index/build-index.ps1docs/NN-*.html を走査し、A1.2 のマーカー間を書き換えます。
用途の説明はスクリプト内の $Purpose に持たせており、未登録の Cmdlet が見つかると実行時に警告が出ます。
A1.1・A1.3・A1.4 は内容の判断が要るため手書きです。

複数の章にまたがる Cmdlet(実測)

全 69 種のうち 21 種が3章以上に登場します。4章以上のものを挙げます。

Cmdlet章数登場する章
Get-Content801, 02, 05, 06, 07, 08, 09, 10
Get-ChildItem701, 05, 06, 07, 08, 09, 10
Write-Host701, 02, 04, 06, 08, 09, 10
Get-Member503, 04, 05, 08, 10
Get-Process501, 05, 06, 07, 10
Set-Content502, 05, 06, 07, 10
Test-Path503, 07, 08, 09, 10
Join-Path406, 07, 09, 10
New-Item403, 05, 09, 10
Set-StrictMode404, 06, 09, 10
Write-Verbose406, 08, 09, 10

残り 48 種は 1〜2 章にのみ登場します。横断する 21 種だけでも索引の価値があることが数字で確認できました。

A2. テンプレ集 — 09 との違い

ここが設計上もっとも重要な判断です。09 と重複させません。

09 実務パターン集A2 テンプレ集
単位完成したスクリプト5本部品・骨格
使い方用途が合えば流用するどんなスクリプトでも最初に書く型
ログ集計、一括リネーム、バックアップparamStrictModetry/catchexit
テンプレート解決すること
A2.1スクリプトの骨格引数・厳格モード・エラー処理・終了コードの定型
A2.2ログ出力Write-Log 関数。無人実行の命綱(09.4 から部品として切り出す)
A2.3引数の検証Mandatory / ValidateSet / ValidateScript の使い分け
A2.4ファイル処理の定型読み・書き・一覧・存在確認。-Encoding 込み
A2.5外部コマンド呼び出し存在確認・終了コード・JSON の受け取り
A2.6配布用の一式ps1 + cmd ランチャー + タスク登録
A2.3 は本編に無い内容です。
[ValidateSet][ValidateScript] は 06.2 で触れていません。引数の検証を型と属性に任せるという PowerShell らしい書き方なので、テンプレ集で扱う価値があります。
他の節は本編の内容を部品として再構成したものです。

A3. モジュール — 導入せずに書いた付録

全4節。業務で効くものだけを8本選び、うち4本を詳しく扱います。網羅は目的にしていません。

この付録だけは、コードを実行して確かめていません。
モジュールを導入すると検証環境が変わってしまうため、Install-Module を実行せずに書きました。そのぶん出力例を載せていませんFind-ModuleGet-Module -ListAvailable のように読み取りだけで確かめられるものは実物を貼り、それ以外はコード例のみに留めています。
A3.3 の冒頭にも同じ断りを置き、読者に対して未検証であることを隠していません。
選定の根拠として使えない数字が2つ見つかりました。
Find-Module が返す lastUpdated常に実行当日を指します。ImportExcel の実際の公開は 2024-10-21 なのに当日の日付が返るため、約2年の開きが見えません。更新日を見るなら PublishedDate を使います。
ダウンロード数も当てになりません。PSWindowsUpdate2,147,474,038 という Int32 上限(2,147,483,647)直下の飽和値を返しました。
この2つを A3.1 の柱にしています。

README への反映

README の逆引き索引(17項目)は残します。役割を分けます。

場所役割項目数
READMEよくある入口だけ17
A1網羅160

8. 資料のビルドと運用

ここから先は資料を作る側の手順です。読むだけなら必要ありません。

HTML を編集したら再生成が必要

docs/NN-*.html capture-figures.ps1(Playwright) tmp/figures/*.png SVG 図を 3 倍 DPI で撮影 tmp/outline/*.json 見出し・本文・章の色を抽出 build-pptx.ps1 → pptx / PDF
図 2 — HTML が唯一の原本。図も pptx もそこから生成される
必ず capture-figures.ps1build-pptx.ps1 の順で実行してください。
pptx は tmp/outline/*.json を材料にするため、先に抽出し直さないと HTML の変更が反映されません。スライド枚数が変わらないときは、この順序を飛ばしている可能性があります。

実行方法

# 0) 章を増減・改題したときに実行する2本
.\src\scripts\nav\build-nav.ps1      # 各章フッターの前後リンク
.\src\scripts\index\build-index.ps1  # A1.2 のコマンド索引

# 1) SVG 図を PNG に書き出す(構造 JSON も同時に出力される)
.\src\scripts\figures\capture-figures.ps1

# 2) pptx を生成する(-Prefix で1章だけも可)
.\src\scripts\pptx\build-pptx.ps1 -Prefix 05 -Pdf -Images

# 3) GitHub 用の Markdown を生成する
.\src\scripts\markdown\build-markdown.ps1

いずれも同名の .cmd をダブルクリックしても実行できます。

Markdown 版について

GitHub は .html をレンダリングしないため、同じ内容の .md を HTML から生成しています。リポジトリ上で読むときはこちらを使ってください。

変換されるものMarkdown での表現
SVG 図docs/images/*.png への画像参照(HTML から撮影した PNG)
.calloutGitHub のアラート記法(> [!NOTE]
バッジ**[pwsh 7]** のような強調表示
章へのリンク.html.md に書き換え。#chNN は見出しのスラッグに差し替え
コードブロック中身から言語を推測(powershell / bat / javascript ほか)
原本は HTML です。
.md を直接編集しても、次回の生成で上書きされます。修正は必ず .html 側に入れてください。
スイッチ効果
-Prefix 05その章だけを生成する
-PdfPDF も出力する
-Imagesスライドを PNG で書き出す(見た目の確認用)
-IncludeSupplements「PowerShell が初めての人へ」もスライドに含める

章を追加したときの手順

  1. docs/NN-タイトル.html を作る
  2. build-nav.ps1 を実行してフッターの前後リンクを作り直す(手で書かない
  3. 構成案 の状態を作成済に更新する(一覧表と詳細見出しの2箇所
  4. 共有環境の targets.ts に追記する
  5. このページの章カードと逆引き索引に追加する
  6. build-index.ps1 を実行して A1.2 のコマンド索引を作り直す。未登録の Cmdlet があると警告が出るので、スクリプト内の $Purpose に追記する
  7. 新しい Cmdlet が出たなら A1.1A1.4 も見直す
Playwright の spec は共有環境側にあります。
N:\2026\PlayWright\projects\20260822-powershell-pwsh-learn\ に置いています。対象ファイルの一覧は targets.ts に集約してあるので、追記はそこ1箇所で済みます。

出力物の置き場所

場所内容git
docs/*.html資料(原本対象
docs/*.mdGitHub 表示用(HTML から生成)対象
docs/images/Markdown が参照する図の PNG対象
src/scripts/ビルド用スクリプト対象
tmp/figures/図の PNG(63 枚)除外
tmp/outline/構造 JSON除外
tmp/pptx/pptx と PDF除外
etc/セッションログ・c.bat除外

生成物はすべて tmp/ にあります。消しても HTML から作り直せます。