引数の引用符付け(組み立て関数)
引数の配列から、受け取り側の分割規則で元どおりに割れる1本のコマンドライン文字列を組み立てる処理。空白か引用符を含むか空の引数を引用符で囲み(空の引数は引用符2つだけになる)、引用符の直前のバックスラッシュを2倍+1、末尾のバックスラッシュを2倍にし、引用符にはバックスラッシュを前置する。往復が保証されるのは受け取り側がCommandLineToArgvW・Cランタイム・.NETランタイムと同じ分割規則でワイド文字のまま分割し(独自の文法で生のコマンドラインを解釈する相手や、途中にシェルのパーサが挟まる場合は対象外)、かつsetargv.obj/wsetargv.objによるワイルドカード展開を有効にしていない場合で(展開が有効だと*や?を含む引数がファイル名に置き換わる)、組み立てた文字列全体がCreateProcessのlpCommandLineの上限(終端のnull文字を含めて32,767 UTF-16コード単位)に収まることも前提になる。コマンドラインがnull終端文字列であるためNUL文字を含む引数は渡せず、狭い文字列のmainではコードページで表せない文字が失われる。
この概念が関わる関係
- 引数の引用符付け(組み立て関数)は末尾バックスラッシュによる引数の巻き込みを防ぎます。
- 引数の引用符付け(組み立て関数)は囲みの内側の引用符2連続(非空の引数)を防ぎます。
- ProcessStartInfo.ArgumentListは引数の引用符付け(組み立て関数)の実装を担います。
- ProcessStartInfo.Arguments(手組み文字列)は引数の引用符付け(組み立て関数)を前提とします。
- 引数の引用符付け(組み立て関数)は子プロセスへの引数の受け渡しに対する本記事の推奨です。
この概念を扱う記事
一次資料
- https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/PasteArguments.cs
- https://learn.microsoft.com/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。