この資料は読者を2種類想定しています。どちらもプログラミングの基礎(変数・条件分岐・繰り返し・関数)は理解している前提です。違いは「その経験が JavaScript かどうか」だけです。
別々の資料を作ると保守が二重になるため、本文は JS 経験者向けに書き、JS 以外の経験者が引っかかる箇所だけ補足枠を添える方式にします。
読者がプログラミングの基礎を持っている前提になったことで、補足枠の中身も絞り込めます。書くのは PowerShell と Windows に固有の事情だけです。
| 判定 | 内容 | 例 |
|---|---|---|
| 書く | Windows 固有の用語 | ANSI、コードページ、WMI、レジストリ、実行ポリシー |
| 書く | シェル特有の概念 | シェルとターミナルの違い、パイプ、リダイレクト、標準出力 |
| 書く | PowerShell 固有の慣習 | 動詞-名詞の命名規則、Cmdlet、$_、終了/非終了エラー |
| 書く | JS の例が読めない読者への言い換え | 「JS の filter に相当」→「配列から条件に合う要素だけ取り出す処理」 |
| 書かない | プログラミングの基礎概念 | 変数とは、関数とは、配列とは、条件分岐とは |
| 書かない | 本文の単なる繰り返し | 本文で説明済みの内容を言い換えただけの枠 |
本資料は Windows PowerShell 5.1 と PowerShell 7 (pwsh) の両方を対象にします。読者の環境がどちらか分からないため、差がある箇所だけをその場でバッジで示します。
| バッジ | 意味 | 使用例 |
|---|---|---|
| pwsh 7 | PowerShell 7 以降でのみ使える/挙動が異なる | 三項演算子 $a ? $b : $c、ForEach-Object -Parallel、既定が BOM なし UTF-8 |
| 5.1 | Windows PowerShell 5.1 固有の注意点 | BOM がないと日本語が壊れる、Invoke-WebRequest が IE エンジン依存 |
| (なし) | 両方で同じように動く | 大半の内容。バッジを付けない |
全ファイルで同じ骨格にすることで、読者が「どこに何が書いてあるか」を予測できるようにします。
| 位置 | 内容 | 目的 |
|---|---|---|
| 冒頭 | この章で何ができるようになるか(3行) | 読む前に到達点を示す |
| 各章 (h1) | 概念 → DOS/JS との対比 → PowerShell の書き方 → 短い実例 | 既知から未知へ橋を架ける |
| 補足枠 | .callout で「PowerShell が初めての人へ」 | 読者Bの補足。読者Aは飛ばせる |
| 末尾 | まとめ表 + 次章への導線 | 復習と連続性 |
| 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 Code | 4 |
| 04 | 変数と型 | 変数・型・演算子・配列・ハッシュテーブル。JS との対比を全節に配置 | 5 |
| 05 | パイプライン | オブジェクトパイプ、Where-Object/ForEach-Object/Select-Object、Cmdlet の命名規則 | 5 |
| 06 | 制御構文と関数 | if/foreach/switch、関数、パラメータ、スコープ | 4 |
| 07 | ファイル操作 | パス操作、Get-Content/Set-Content のエンコーディング、CSV/JSON | 4 |
| 08 | エラー処理 | try/catch、$ErrorActionPreference、終了コード、デバッグ手順 | 4 |
| 09 | 実務パターン集 | ログ集計、一括リネーム、タスクスケジューラ連携、他プロセス呼び出し | 5 |
| 10 | ハンズオン | 勉強会用の課題と解答例、詰まりやすい箇所の解説 | 3 |
| 11 | Add-Type | C# をその場でコンパイルして呼ぶ。P/Invoke、型の再定義制限、csc.exe で exe 化 | 7 |
| 12 | COMとOffice | Word・Excel・PowerPoint の操作と PDF 化、プロセスを残さない後始末 | 5 |
| A1 | 逆引き | 症状・コマンド名・JavaScript・用語の4つの入口から該当箇所へ引く索引 | 4 |
| A2 | テンプレ集 | コピーして使う雛形。スクリプトの骨格・ログ・引数検証・ファイル処理ほか | 6 |
| A3 | モジュール | 業務で使えるモジュール厳選8本。選ぶ基準、導入とオフライン配布 | 4 |
A1- A2- A3- の記法にします。01〜12 は順に読む前提ですが、付録は必要になったときに引くものです。番号体系を変えることで、読者が「順番に読まなくてよい」と判断できます。10- の後ろに並ぶため、一覧の見た目も崩れません。
DOS/cmd の限界 → Bash の強み → PowerShell が必要だった理由 → 設計思想 → 他言語との立場、の4章構成。SVG図4枚で、テキストパイプとオブジェクトパイプの違いを視覚化済み。
この資料で最初に「決まりごと」が出てくる章です。理由を説明せずに規則だけ書くと必ず忘れられるので、文字コードの仕組みから入ります。
| 節 | 内容 | 添える対比 |
|---|---|---|
| 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 と違う) |
注意3行目に注目してください。Shift-JIS の ps1 は 5.1 では動くが 7 では壊れます。「今まで動いていたスクリプトが pwsh に変えた途端に文字化けする」典型的な原因がこれです。02.2 ではこの逆転を必ず扱います。
| 節 | 内容 | 添える対比 |
|---|---|---|
| 03.1 | 5.1 と 7 の違い、共存の考え方、powershell.exe と pwsh.exe の使い分け。以降の章で使うバージョンバッジの説明もここで行う | Node.js のバージョン共存 |
| 03.2 | 実行ポリシー — なぜ既定でスクリプトが動かないのか | DOS の bat には無かった概念 |
| 03.3 | プロファイル、モジュールパス、$PSVersionTable | .bashrc/node_modules |
| 03.4 | VS Code での編集・デバッグ環境 | — |
読者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"
$ 記法、型推論、明示的な型指定-eq/-gt と、既定で大小文字を区別しない落とし穴$null・真偽値・型変換の癖Get-Member で中身を覗く — この1つを覚えるだけで自習できるようになるWhere-Object/ForEach-Object/Select-ObjectSort-Object/Group-Object/Measure-ObjectGet-Command での探し方if/foreach/while/switch — JS との構文差param()、既定値、パイプライン入力の受け取り$script:/$global:)return の感覚で書くと、途中の Write-Output や式の評価結果まで戻り値に混ざります。要素1個の配列がスカラーに潰れる問題(return ,$array)もここで扱います。
| 節 | 内容 | 注意点 |
|---|---|---|
| 07.1 | パス操作 — Join-Path、Resolve-Path、相対パス | カレントは .\ を明示 |
| 07.2 | Get-ChildItem — 再帰、フィルタ | ワイルドカードと -Filter の併用で0件になる罠 |
| 07.3 | Get-Content/Set-Content のエンコーディング指定 | 02章の内容がここで効く。5.1 と pwsh 7 で -Encoding の既定値が違う |
| 07.4 | CSV/JSON の読み書き | ConvertTo-Json の深さ制限 |
try/catch/finally と -ErrorAction Stop$LASTEXITCODE、外部コマンドの失敗検知Write-Verbose/ブレークポイント/Set-PSDebugここまでの知識を組み合わせた「そのまま使える」スクリプト集。各パターンは50行以内に収め、写経できる長さにします。
Group-Object)当初の構成は 01〜10 の3部構成でした。11・12 は本編を一通り書き終えたあとに追加したもので、性格が本編とは違います。
全7節。すべてのコードを 5.1 と 7 の両方で実行して確認しています。
Add-Type -TypeDefinition の基本-MemberDefinition と DllImportcsc.exe を直接使うStringBuilder を PowerShell から回すループは 5.1 が 48〜58ms、pwsh 7 が 191〜200ms で7 が約4倍遅いという結果でした。C# の静的メソッドを1回ずつ呼ぶ形も、30万回で PowerShell のみ 818ms に対し C# 呼び出し 1,809ms と逆に遅くなります。ループごと C# に渡して初めて 4ms になります。全5節。Word・Excel・PowerPoint の COM を実際に動かして確認しています。
New-Object -ComObject。VBA のオブジェクトモデルがそのまま使えるQuit() だけではプロセスが残る。ReleaseComObject と try/finallyImportExcel・CSV との使い分けbuild-pptx.ps1 が踏んだ罠src/scripts/pptx/build-pptx.ps1 は資料の pptx を作るために PowerPoint COM を使っており、ExportAsFixedFormat が PowerShell の遅延バインディングで通らず SaveAs で回避した経緯がコメントとして残っていました。資料を作る道具そのものが実例になっています。SaveAs が「名前 2.pptx」を作るという既存コメントだけは再現できず、未再現と明記して載せています。
各回の進行表は受講者が見るものなので README の4章「勉強会で使う場合」 に置いています。ここでは主催する側の準備だけを扱います。
RemoteSigned に変更できないと以降が進まない.callout 枠で対応し、別ファイルは作らない
| 本編 01〜10 | 付録 A1・A2 | |
|---|---|---|
| 読み方 | 順に読む | 必要なときに引く |
| 目的 | 理解する | 思い出す・写す |
| 構成 | 説明 → 図 → 例 → まとめ | 表とコードが主体 |
資料には Cmdlet 76種が12章に散らばっています。「あのコマンドはどの章だったか」を引けるようにします。
| 節 | 引き方 | 内容 | 項目数の目安 |
|---|---|---|---|
| A1.1 | 症状から | 「0 件しか返らない」「文字化けする」「try/catch が効かない」 | 38 |
| A1.2 | コマンドから | Cmdlet 名 → 用途と解説箇所。HTML から自動生成する | 69 |
| A1.3 | JavaScript から | filter → Where-Object のような対応表 | 28 |
| A1.4 | 用語から | Cmdlet・BOM・実行ポリシー・非終了エラー等の一言定義 | 25 |
src/scripts/index/build-index.ps1 が docs/NN-*.html を走査し、A1.2 のマーカー間を書き換えます。$Purpose に持たせており、未登録の Cmdlet が見つかると実行時に警告が出ます。全 69 種のうち 21 種が3章以上に登場します。4章以上のものを挙げます。
| Cmdlet | 章数 | 登場する章 |
|---|---|---|
| Get-Content | 8 | 01, 02, 05, 06, 07, 08, 09, 10 |
| Get-ChildItem | 7 | 01, 05, 06, 07, 08, 09, 10 |
| Write-Host | 7 | 01, 02, 04, 06, 08, 09, 10 |
| Get-Member | 5 | 03, 04, 05, 08, 10 |
| Get-Process | 5 | 01, 05, 06, 07, 10 |
| Set-Content | 5 | 02, 05, 06, 07, 10 |
| Test-Path | 5 | 03, 07, 08, 09, 10 |
| Join-Path | 4 | 06, 07, 09, 10 |
| New-Item | 4 | 03, 05, 09, 10 |
| Set-StrictMode | 4 | 04, 06, 09, 10 |
| Write-Verbose | 4 | 06, 08, 09, 10 |
残り 48 種は 1〜2 章にのみ登場します。横断する 21 種だけでも索引の価値があることが数字で確認できました。
ここが設計上もっとも重要な判断です。09 と重複させません。
| 09 実務パターン集 | A2 テンプレ集 | |
|---|---|---|
| 単位 | 完成したスクリプト5本 | 部品・骨格 |
| 使い方 | 用途が合えば流用する | どんなスクリプトでも最初に書く型 |
| 例 | ログ集計、一括リネーム、バックアップ | param + StrictMode + try/catch + exit |
| 節 | テンプレート | 解決すること |
|---|---|---|
| A2.1 | スクリプトの骨格 | 引数・厳格モード・エラー処理・終了コードの定型 |
| A2.2 | ログ出力 | Write-Log 関数。無人実行の命綱(09.4 から部品として切り出す) |
| A2.3 | 引数の検証 | Mandatory / ValidateSet / ValidateScript の使い分け |
| A2.4 | ファイル処理の定型 | 読み・書き・一覧・存在確認。-Encoding 込み |
| A2.5 | 外部コマンド呼び出し | 存在確認・終了コード・JSON の受け取り |
| A2.6 | 配布用の一式 | ps1 + cmd ランチャー + タスク登録 |
[ValidateSet] や [ValidateScript] は 06.2 で触れていません。引数の検証を型と属性に任せるという PowerShell らしい書き方なので、テンプレ集で扱う価値があります。全4節。業務で効くものだけを8本選び、うち4本を詳しく扱います。網羅は目的にしていません。
PSScriptAnalyzer/ImportExcel/SecretManagement+SecretStore/Pester-Scope CurrentUser、Save-Module でのオフライン配布、#Requires -ModulesInstall-Module を実行せずに書きました。そのぶん出力例を載せていません。Find-Module や Get-Module -ListAvailable のように読み取りだけで確かめられるものは実物を貼り、それ以外はコード例のみに留めています。Find-Module が返す lastUpdated は常に実行当日を指します。ImportExcel の実際の公開は 2024-10-21 なのに当日の日付が返るため、約2年の開きが見えません。更新日を見るなら PublishedDate を使います。PSWindowsUpdate は 2,147,474,038 という Int32 上限(2,147,483,647)直下の飽和値を返しました。README の逆引き索引(17項目)は残します。役割を分けます。
| 場所 | 役割 | 項目数 |
|---|---|---|
| README | よくある入口だけ | 17 |
| A1 | 網羅 | 160 |
ここから先は資料を作る側の手順です。読むだけなら必要ありません。
capture-figures.ps1 → build-pptx.ps1 の順で実行してください。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 をダブルクリックしても実行できます。
GitHub は .html をレンダリングしないため、同じ内容の .md を HTML から生成しています。リポジトリ上で読むときはこちらを使ってください。
| 変換されるもの | Markdown での表現 |
|---|---|
| SVG 図 | docs/images/*.png への画像参照(HTML から撮影した PNG) |
.callout | GitHub のアラート記法(> [!NOTE]) |
| バッジ | **[pwsh 7]** のような強調表示 |
| 章へのリンク | .html → .md に書き換え。#chNN は見出しのスラッグに差し替え |
| コードブロック | 中身から言語を推測(powershell / bat / javascript ほか) |
.md を直接編集しても、次回の生成で上書きされます。修正は必ず .html 側に入れてください。
| スイッチ | 効果 |
|---|---|
-Prefix 05 | その章だけを生成する |
-Pdf | PDF も出力する |
-Images | スライドを PNG で書き出す(見た目の確認用) |
-IncludeSupplements | 「PowerShell が初めての人へ」もスライドに含める |
docs/NN-タイトル.html を作るbuild-nav.ps1 を実行してフッターの前後リンクを作り直す(手で書かない)targets.ts に追記するbuild-index.ps1 を実行して A1.2 のコマンド索引を作り直す。未登録の Cmdlet があると警告が出るので、スクリプト内の $Purpose に追記するN:\2026\PlayWright\projects\20260822-powershell-pwsh-learn\ に置いています。対象ファイルの一覧は targets.ts に集約してあるので、追記はそこ1箇所で済みます。
| 場所 | 内容 | git |
|---|---|---|
docs/*.html | 資料(原本) | 対象 |
docs/*.md | GitHub 表示用(HTML から生成) | 対象 |
docs/images/ | Markdown が参照する図の PNG | 対象 |
src/scripts/ | ビルド用スクリプト | 対象 |
tmp/figures/ | 図の PNG(63 枚) | 除外 |
tmp/outline/ | 構造 JSON | 除外 |
tmp/pptx/ | pptx と PDF | 除外 |
etc/ | セッションログ・c.bat | 除外 |
生成物はすべて tmp/ にあります。消しても HTML から作り直せます。