batファイルから実行するプログラムに、長いパラメータ文字列を渡す必要があったので、その上限について調べてみました。
Microsoft Learn では、コマンド プロンプト について、以下のように記載されています。
コマンド プロンプトで使用できる文字列の最大長は 8191 文字です。
(出典:コマンド プロンプトの行文字列の制限 - Windows Client | Microsoft Learn)
また、コマンド ライン については、以下のように記載されています。
実行するコマンド ライン。この文字列の最大長は 32,767 文字 (Unicode 終端の null 文字を含む) です。
(出典:CreateProcessW 関数 (processthreadsapi.h) - Win32 apps | Microsoft Learn)
実際の挙動はどうなっているのか確かめてみました。
※いずれも、Windows 11 25H2 での結果です。
検証用プログラム
パラメータをファイルへ出力するだけの、以下のようなプログラム(C++)を使って確認しました。
output_param.exe
---
#include
int main(int argc, char* argv[]) {
if (argc > 1) {
std::ofstream ofs("output_param.txt");
ofs << argv[1];
}
return 0;
}
batファイル
call_output_param.bat
---
@echo off
output_param 01234567890abcdefg・・・
実行ファイルパス(output_param )も含めて、32,765 文字 までいけました。
※おそらく、Unicode 終端の null 文字 で 2文字 必要なのだと思います。
※output_param.txt には 実行ファイルパス(output_param :13文字)を除いた、32,752 文字 出力できました。
文字数なので、パラメータを全角文字にしても、32,765 文字 までいけます。
output_param 0123456789・・・
32,765 文字 を超えると、以下のようなエラーとなります。
指定されたプログラムは実行できません。
ps1ファイル
call_output_param.ps1
---
.\output_param 01234567890abcdefg・・・
PowerShell では、実行ファイルの絶対パスが補完(今回は、d:\tmp\output_param.exe)されるようで、それも含めて 32,765 文字 までいけました。
※output_param.txt には 32,740 文字 出力できました。
32,765 文字 を超えると、以下のようなエラーとなります。
プログラム 'output_param.exe' の実行に失敗しました: ファイル名または拡張子が長すぎます。
コマンド プロンプト(cmd.exe)
コマンド プロンプト から以下のようなコマンドを入力して直接実行する場合です。
> output_param 01234567890abcdefg・・・
実行ファイルパス(output_param )も含めて、8,190 文字 までいけました。
※output_param.txt には 8,177 文字 出力できました。
8,190 文字 を超えると、以下のようなエラーとなります。
入力行が長すぎます。
まとめ
それぞれ Microsoft Learn に記載されていた通りの挙動になることを確認できました。
基本的には、実行ファイルパスを含めて 32,765 文字 までいけるようです。
ただし、コマンド プロンプト(cmd.exe) を 利用する場合などは 8,190 文字 になります。
パラメータが長くなってしまう場合、その上限には気を付けておきたいと思います。

