知識マップ: PowerShellから外部exeを正しく呼ぶ ── 引数のクォート・終了コード・文字化けの落とし穴

記事「PowerShellから外部exeを正しく呼ぶ ── 引数のクォート・終了コード・文字化けの落とし穴」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事はPowerShellから外部プログラムへ引数を渡す仕組みを扱い、コマンド呼び出し以降を解析する引数モードと、PowerShell 7.3で$PSNativeCommandArgumentPassingにより変更された引数渡しの破壊的変更を軸に整理します。従来のLegacy方式は引数を1本の文字列に組み立て直すため引用符消失や空文字列の消失を招きますが、7.3以降のWindowsモードやProcessStartInfo.ArgumentList、配列スプラッティングはこれを防ぎます。停止解析トークン--%は固定文字列専用で変数には使えず、バッチファイルへの信頼できない入力はコマンド注入のリスクになります。文字化けは受信の[Console]::OutputEncodingと送信の$OutputEncodingを分けて考え、成否は$LASTEXITCODEで判定し、標準出力と標準エラーを同期的に読み切る書き方はデッドロックを招きます。

PowerShellからのネイティブコマンド引数渡しの知識マップPowerShell 7.3の破壊的変更である$PSNativeCommandArgumentPassingがLegacy方式の引用符消失・空文字列消失を解消すること、配列スプラッティングとProcessStartInfo.ArgumentListによる確実な引数渡し、停止解析トークン--%の制約、標準出力と標準エラーの同期読み取りが招くデッドロック、文字コード設定と終了コード判定の関係を示す図利用するで構成できるの後継利用する利用する原因になり得る防止する防止する防止する推奨される対応推奨される対応両立しない推奨される対応原因になり得る原因になり得る利用する利用する利用するで確認できる前提とする用いるのは非推奨で確認できる推奨される対応ネイティブコマンドへの引数渡し$PSNativeCommandArgumentPassing引数モード(argument mode)による解析Legacy方式の引数渡し(5.1相当)Windowsモード(7.3以降の既定)引用符消失・空文字列引数の消失ProcessStartInfo.ArgumentList配列スプラッティングによる引数渡し停止解析トークン(--%)Windows PowerShell 5.1ProcessStartInfo.Arguments(手組み文字列)バッチファイル経由のコマンド注入リスク片方のストリームを同期的にReadToEndで読み切る書き方デッドロック(deadlock)[Console]::OutputEncoding$OutputEncoding$LASTEXITCODEstderr出力と成否判定の分離2>&1によるstderrの合流Trace-Command -Name ParameterBindingStart-Process

概念間の関係(全23件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

ネイティブコマンドへの引数渡し
PowerShellが解析した引数を、外部プログラム(ネイティブコマンド)のプロセスへ渡す一連の仕組み。引数モードでの構文解析と、解析後にプロセスへ届ける経路の2段階からなる。
$PSNativeCommandArgumentPassing
ネイティブコマンドへの引数の組み立て方をLegacy・Standard・Windowsの3つから切り替える環境設定変数。PowerShell 7.3で導入され、Windowsプラットフォームでの既定値はWindows。
Windowsモード(7.3以降の既定)
PowerShell 7.3で導入された引数渡しの既定モード。cmd.exe・cscript.exe・wscript.exeおよび.bat/.cmd/.js/.vbs/.wsfの呼び出しだけは自動的にLegacy方式になる。
Legacy方式の引数渡し(5.1相当)
解析済みの引数をスペース区切りの1本の文字列に組み立て直してからプロセスへ渡す従来方式。
ProcessStartInfo.ArgumentList
.NET Core 2.1以降で、引数をコレクションとして個別に指定でき、必要な引用符付けをランタイムが行うProcessStartInfoのプロパティ。
配列スプラッティングによる引数渡し
引数を配列の要素として渡し、各要素を独立した引数としてネイティブコマンドに渡す書き方。
停止解析トークン(--%)
以降の文字列をPowerShellが解釈せずそのまま渡す、Windowsのネイティブコマンド呼び出し専用のトークン。%VAR%形式の環境変数だけは展開され、PowerShell変数は使えず、効果は次の改行かパイプまでに限られる。
ProcessStartInfo.Arguments(手組み文字列)
引用符付けを自分で行った1本のコマンドライン文字列として引数を渡す、ProcessStartInfoの旧来のプロパティ。
片方のストリームを同期的にReadToEndで読み切る書き方
標準出力・標準エラーの一方を先にReadToEnd()で読み切ってからもう片方を読む書き方。読んでいない側のパイプバッファが埋まると子プロセスが書き込みでブロックし、永久に返らなくなることがある。
stderr出力と成否判定の分離
stderrへの出力それ自体は失敗を意味せず、成否は終了コードで判定するという考え方。
2>&1によるstderrの合流
ネイティブコマンドのエラーストリームを成功ストリームに合流させるリダイレクト。
Start-Process
別ウィンドウでの起動・別ユーザーでの実行・管理者権限への昇格など、起動の仕方を制御したいときに使うコマンドレット。既定では完了を待たない。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。