Windowsでは、コマンドライン文字列の最大長はいくつですか?次のようなコマンドラインで引数を取るプログラムを指定した場合の意味abc.exe -name=abc
私が書いたシンプルなコンソールアプリケーションは、コマンドラインを介してパラメーターを取り、最大許容量を知りたいと思っています。
Windowsでは、コマンドライン文字列の最大長はいくつですか?次のようなコマンドラインで引数を取るプログラムを指定した場合の意味abc.exe -name=abc
私が書いたシンプルなコンソールアプリケーションは、コマンドラインを介してパラメーターを取り、最大許容量を知りたいと思っています。
回答:
Microsoftのドキュメントから:コマンドプロンプト(Cmd.exe)コマンドライン文字列の制限
Microsoft Windows XP以降を実行しているコンピューターでは、コマンドプロンプトで使用できる文字列の最大長は8191文字です。
古いスレッドを掘り下げてすみませんが、sunetosの答えは正しくない(または完全な答えではない)と思います。(c#でProcessStartInfoを使用して)いくつかの実験を行いましたが、コマンドラインコマンドの「引数」文字列は、XPでは2048文字、Win7では32768文字に制限されているようです。8191の制限が何を指しているのかはわかりませんが、その証拠はまだ見つかっていません。
@Sugrueとして、私も古いスレッドを掘り出しています。
32768(32767である必要があると思いますが、実験的なテスト結果を信じさせます)文字制限がある理由を説明するために、Windows APIを掘り下げる必要があります。
コマンドライン引数を使用してプログラムをどのように起動しても、ShellExecute、CreateProcessまたはそれらの拡張バージョンに渡されます。これらのAPIは、公式に文書化されていない他のNTレベルのAPIを基本的にラップします。私の知る限り、これらの呼び出しはNtCreateProcessをラップします。これには、パラメーターとしてOBJECT_ATTRIBUTES構造体が必要であり、その構造体を作成するためにInitializeObjectAttributesが使用されます。この場所で見るUNICODE_STRING
。それでは、この構造を見てみましょう:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
これは、使用USHORT
ストア長さに変数を、(16ビット長[65535 0])。そしてよると、この、長さはバイトではなく文字数で大きさを示しています。したがって、次のようになります65535 / 2 = 32767
(WCHAR
長さが2バイトであるため)。
この数を掘り下げるにはいくつかの手順がありますが、それが明確であることを願っています。
また、@ sunetosをサポートするために、受け入れられるものに答えてください。8191はに入力できる最大数です。cmd.exe
この制限を超えると、The input line is too long.
エラーが生成されます。したがって、cmd.exe
新しいプロセスに引数を渡す唯一の方法ではないという事実にもかかわらず、答えは正しいです。
ObjectAttributes
はセキュリティ記述子にのみ使用され、返されるハンドルを継承可能にします。コマンドラインはProcessParameters
、プロセス環境ブロック(PEB)によって参照されるで渡されます。古いバージョンではNtCreateProcess
、これらのパラメータはを介して子プロセスに書き込む必要がありますNtWriteVirtualMemory
。今日ではNtCreateUserProcess
、いくつかの単一のカーネル・サービスの呼び出し組み合わせた、使用されている-例えば作成Section
、Process
およびThread
オブジェクトを、そして、プロセスパラメータを書きます。
CreateProcessW
はコマンドラインとアプリケーションパスにnullで終了する文字列を使用します。制限は32,767-1、つまり32,766文字です。
CreateProcessW
、UNICODE_STRING
構造体に正確な長さを格納し、両方Length
とMaximumLength
65,534に設定する場合があります、それはの正当な議論ですNtCreateProcess
。
Windows 10では、8191文字のままです...少なくとも私のマシンでは。
8191文字の後のテキストを切り捨てるだけです。ええと、実際には、8196文字を取得しました。8196を超えると、入力できなくなります。
次のスクリプトは、使用できるステートメントの長さをテストします。まあ、gawk / awkがインストールされているとしましょう。
echo rem this is a test of how long of a line that a .cmd script can generate >testbat.bat
gawk 'BEGIN {printf "echo -----";for (i=10;i^<=100000;i +=10) printf "%%06d----",i;print;print "pause";}' >>testbat.bat
testbat.bat