代码之家  ›  专栏  ›  技术社区  ›  user195488

命令行字符串的最大长度

  •  90
  • user195488  · 技术社区  · 15 年前

    在Windows中,命令行字符串的最大长度是多少?这意味着如果我指定了一个在命令行上接受参数的程序,比如 abc.exe -name=abc

    我编写的一个简单的控制台应用程序通过命令行获取参数,我想知道允许的最大数量是多少。

    3 回复  |  直到 8 年前
        1
  •  93
  •   Mofi    5 年前

    从Microsoft文档: Command prompt (Cmd. exe) command-line string limitation

    在运行Microsoft Windows XP或更高版本的计算机上,可以在命令提示符处使用的字符串的最大长度为8191个字符。

        2
  •  73
  •   Community CDub    8 年前

    抱歉挖出一根旧线,但我想 sunetos' answer 不正确(或者不是完整答案)。我做了一些实验(在c#中使用ProcessStartInfo),似乎命令行命令的“arguments”字符串在XP中限制为2048个字符,在Win7中限制为32768个字符。我不知道8191的限制是指什么,但我还没有找到任何证据。

        3
  •  44
  •   ST3    9 年前

    作为@Sugrue,我也在挖掘一条旧线索。

    无论您如何用命令行参数启动程序,它都会 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位长度[0;65535])变量来存储长度。根据 this ,长度表示字节大小,而不是字符大小。所以我们有: 65535 / 2 = 32767 (因为 WCHAR


    cmd.exe ,如果超过此限制, The input line is too long. 生成错误。所以,答案是正确的,尽管事实是 命令提示符 不是为新进程传递参数的唯一方法。

        4
  •  5
  •   Joseph Dewey    6 年前

    它只是切断了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