知識マップ: PowerShellから外部exeを正しく呼ぶ ── 引数のクォート・終了コード・文字化けの落とし穴
記事「PowerShellから外部exeを正しく呼ぶ ── 引数のクォート・終了コード・文字化けの落とし穴」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事はPowerShellから外部プログラムへ引数を渡す仕組みを扱い、コマンド呼び出し以降を解析する引数モードと、PowerShell 7.3で$PSNativeCommandArgumentPassingにより変更された引数渡しの破壊的変更を軸に整理します。従来のLegacy方式は引数を1本の文字列に組み立て直すため引用符消失や空文字列の消失を招きますが、7.3以降のWindowsモードやProcessStartInfo.ArgumentList、配列スプラッティングはこれを防ぎます。停止解析トークン--%は固定文字列専用で変数には使えず、バッチファイルへの信頼できない入力はコマンド注入のリスクになります。文字化けは受信の[Console]::OutputEncodingと送信の$OutputEncodingを分けて考え、成否は$LASTEXITCODEで判定し、標準出力と標準エラーを同期的に読み切る書き方はデッドロックを招きます。
flowchart LR
accTitle: PowerShellからのネイティブコマンド引数渡しの知識マップ
accDescr: PowerShell 7.3の破壊的変更である$PSNativeCommandArgumentPassingがLegacy方式の引用符消失・空文字列消失を解消すること、配列スプラッティングとProcessStartInfo.ArgumentListによる確実な引数渡し、停止解析トークン--%の制約、標準出力と標準エラーの同期読み取りが招くデッドロック、文字コード設定と終了コード判定の関係を示す図
native_command_argument_passing["ネイティブコマンドへの引数渡し"]
psnativecommandargumentpassing["$PSNativeCommandArgumentPassing"]
argument_mode_parsing["引数モード(argument mode)による解析"]
legacy_argument_passing["Legacy方式の引数渡し(5.1相当)"]
windows_argument_passing_mode["Windowsモード(7.3以降の既定)"]
broken_argument_delivery["引用符消失・空文字列引数の消失"]
processstartinfo_argumentlist["ProcessStartInfo.ArgumentList"]
array_splatting_native_args["配列スプラッティングによる引数渡し"]
stop_parsing_token["停止解析トークン(--%)"]
windows_powershell_5_1["Windows PowerShell 5.1"]
processstartinfo_arguments_string["ProcessStartInfo.Arguments(手組み文字列)"]
batch_file_command_injection["バッチファイル経由のコマンド注入リスク"]
sync_readtoend_redirect["片方のストリームを同期的にReadToEndで読み切る書き方"]
deadlock["デッドロック(deadlock)"]
console_outputencoding["[Console]::OutputEncoding"]
dollar_outputencoding["$OutputEncoding"]
lastexitcode["$LASTEXITCODE"]
stderr_exit_code_semantics["stderr出力と成否判定の分離"]
stderr_merge_redirection["2>&1によるstderrの合流"]
trace_command_parameterbinding["Trace-Command -Name ParameterBinding"]
start_process_cmdlet["Start-Process"]
native_command_argument_passing -->|"利用する"| argument_mode_parsing
native_command_argument_passing -->|"で構成できる"| psnativecommandargumentpassing
psnativecommandargumentpassing -->|"の後継"| legacy_argument_passing
psnativecommandargumentpassing -->|"利用する"| windows_argument_passing_mode
windows_argument_passing_mode -->|"利用する"| legacy_argument_passing
legacy_argument_passing -->|"原因になり得る"| broken_argument_delivery
windows_argument_passing_mode -.->|"防止する"| broken_argument_delivery
processstartinfo_argumentlist -->|"防止する"| broken_argument_delivery
array_splatting_native_args -.->|"防止する"| broken_argument_delivery
array_splatting_native_args -->|"推奨される対応"| native_command_argument_passing
stop_parsing_token -.->|"推奨される対応"| native_command_argument_passing
processstartinfo_argumentlist -->|"両立しない"| windows_powershell_5_1
processstartinfo_arguments_string -->|"推奨される対応"| legacy_argument_passing
native_command_argument_passing -.->|"原因になり得る"| batch_file_command_injection
sync_readtoend_redirect -->|"原因になり得る"| deadlock
processstartinfo_argumentlist -->|"利用する"| sync_readtoend_redirect
native_command_argument_passing -->|"利用する"| console_outputencoding
native_command_argument_passing -->|"利用する"| dollar_outputencoding
native_command_argument_passing -->|"で確認できる"| lastexitcode
stderr_exit_code_semantics -->|"前提とする"| lastexitcode
stderr_merge_redirection -.->|"用いるのは非推奨"| native_command_argument_passing
native_command_argument_passing -->|"で確認できる"| trace_command_parameterbinding
start_process_cmdlet -.->|"推奨される対応"| native_command_argument_passing
概念間の関係(全23件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- ネイティブコマンドへの引数渡しは引数モード(argument mode)による解析を利用します。
- ネイティブコマンドへの引数渡しは$PSNativeCommandArgumentPassingで構成できます。
- $PSNativeCommandArgumentPassingはLegacy方式の引数渡し(5.1相当)の後継に当たります。
- $PSNativeCommandArgumentPassingはWindowsモード(7.3以降の既定)を利用します。
- Windowsモード(7.3以降の既定)はLegacy方式の引数渡し(5.1相当)を利用します。
- Legacy方式の引数渡し(5.1相当)は引用符消失・空文字列引数の消失の原因になることがあります。
- Windowsモード(7.3以降の既定)は引用符消失・空文字列引数の消失を防ぎます。
- ProcessStartInfo.ArgumentListは引用符消失・空文字列引数の消失を防ぎます。
- 配列スプラッティングによる引数渡しは引用符消失・空文字列引数の消失を防ぎます。
- 配列スプラッティングによる引数渡しはネイティブコマンドへの引数渡しに対する本記事の推奨です。
- 停止解析トークン(--%)はネイティブコマンドへの引数渡しに対する本記事の推奨です。
- ProcessStartInfo.ArgumentListはWindows PowerShell 5.1と両立しません。
- ProcessStartInfo.Arguments(手組み文字列)はLegacy方式の引数渡し(5.1相当)に対する本記事の推奨です。
- ネイティブコマンドへの引数渡しはバッチファイル経由のコマンド注入リスクの原因になることがあります。
- 片方のストリームを同期的にReadToEndで読み切る書き方はデッドロック(deadlock)の原因になることがあります。
- ProcessStartInfo.ArgumentListは片方のストリームを同期的にReadToEndで読み切る書き方を利用します。
- ネイティブコマンドへの引数渡しは[Console]::OutputEncodingを利用します。
- ネイティブコマンドへの引数渡しは$OutputEncodingを利用します。
- ネイティブコマンドへの引数渡しは$LASTEXITCODEで確認できます。
- stderr出力と成否判定の分離は$LASTEXITCODEを前提とします。
- 2>&1によるstderrの合流をネイティブコマンドへの引数渡しに用いることは推奨されません。
- ネイティブコマンドへの引数渡しはTrace-Command -Name ParameterBindingで確認できます。
- Start-Processはネイティブコマンドへの引数渡しに対する本記事の推奨です。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。