命令行参数参数限制

Posted

技术标签:

【中文标题】命令行参数参数限制【英文标题】:commandline argument parameter limitation 【发布时间】:2012-02-25 06:45:31 【问题描述】:

语言:C# 我必须传递一个巨大的字符串数组(动态构建)作为运行 exe 的参数。 我正在考虑通过以下两种方式来实现它。但我没有信心。

    我可以将它创建为一个由空格分隔的字符串。我可以通过 Process.Start 调用 exe。 因此,正在运行的子进程将空间视为字符串数组。 但是我不确定字符串数组的限制。假设我的字符串数组计数超过 10,000

    我可以将它创建为一个由特殊符号分隔的字符串,它永远不会落在数据中。我可以用字符串调用exe。正在运行的子进程将其视为一个字符串,我可以在其中使用相同的分隔符将其拆分以获取字符串数组。但是,在这里我不确定命令大小。如果命令行字符串长度很大,会这样做吗

谁能帮我告诉我参数大小限制

【问题讨论】:

我建议写入一个临时文本文件,使用文本文件作为参数创建进程,等待进程完成然后删除文件。 【参考方案1】:

您可以将参数存储在文本文件中并将该文本文件作为参数传递。然后,您的应用程序可以解析文本文件以分析参数。

【讨论】:

【参考方案2】:

这取决于操作系统:

请参阅 Microsoft 支持网站上的 Command prompt (Cmd. exe) command-line string limitation。

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

(强调我的)

关于字符串数组的大小 - 如果字符串数组中有数百万个字符串 - 您主要受到可用内存量的限制。

【讨论】:

【参考方案3】:

如果您将 10,000 个参数传递给程序,您应该将这些参数放在一个文件中并从磁盘读取该文件。

【讨论】:

或将概念提炼成更易于管理的东西,让程序决定如何获取信息。 (例如,查询或查询的参数,而不是查询结果)【参考方案4】:

对大型数组使用命令行参数并不是很好的做法。将您的参数放在配置文件中,然后将文件名作为命令行参数传递。

操作系统限制因 Windows 版本而异。它可能是大约 2k 或 8k:

http://support.microsoft.com/kb/830473

【讨论】:

【参考方案5】:

您可能需要考虑创建一个参数文件并将该文件作为参数传递。

我发现了这个:

对于操作系统:最大命令行长度为 32767 个字符(此限制来自 unicode 字符串结构),命令提示符最大长度为 8192 个字符(此限制来自 cmd.exe)。您还可以检查:

http://support.microsoft.com/kb/830473

希望对您有所帮助。

【讨论】:

【参考方案6】:

虽然是个坏主意,Process.startuseshellexecute=false 会调用 createprocess(),它允许在命令行中使用 32767 个字符(尽管这也是整个环境块的最大大小)

【讨论】:

为什么这是个坏主意? 更像是非常规的想法【参考方案7】: 命令提示符(Cmd.exe)的限制是 8191。Command prompt (Cmd. exe) command-line string limitation 在 c# 代码中使用 Process 的限制在 win10 中为 32768 个字符。 使用 Process.start() 测试

【讨论】:

【参考方案8】:

如果直接从父进程启动子进程是可以接受的(UseShellExecute= false),那么你可以重定向子进程的StandardInput并传递任意大小的数据扔它。这是一个传递 100000 个字符串和其他内容的数组的示例,以二进制格式将它们序列化。

static void Main(string[] args)

    if (args.Length == 0)
    
        var exeFilePath = Assembly.GetExecutingAssembly().Location;
        var psi = new ProcessStartInfo(exeFilePath, "CHILD");
        psi.UseShellExecute = false;
        psi.RedirectStandardInput = true;
        Console.WriteLine("Parent - Starting child process");
        var childProcess = Process.Start(psi);
        var bf = new BinaryFormatter();
        object[] data = Enumerable.Range(1, 100000)
            .Select(i => (object)$"String-i")
            .Append(13)
            .Append(DateTime.Now)
            .Append(new DataTable("Customers"))
            .ToArray();
        Console.WriteLine("Parent - Sending data");
        bf.Serialize(childProcess.StandardInput.BaseStream, data);
        Console.WriteLine("Parent - WaitForExit");
        childProcess.WaitForExit();
        Console.WriteLine("Parent - Closing");
    
    else
    
        Console.WriteLine("Child - Started");
        var bf = new BinaryFormatter();
        Console.WriteLine("Child - Reading data");
        var data = (object[])bf.Deserialize(Console.OpenStandardInput());
        Console.WriteLine($"Child - Data.Length: data.Length");
        Console.WriteLine("Child - Closing");
    

输出:

父进程 - 启动子进程 孩子 - 开始 孩子 - 读取数据 家长 - 发送数据 父级 - WaitForExit 子级 - 数据长度:100003 孩子 - 关闭 父级 - 关闭

这个例子在我的机器上执行只需 6 秒。

【讨论】:

以上是关于命令行参数参数限制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中处理命令行参数?

Bash 命令行和输入限制

如何转义变量中的特殊字符以在 bash 中提供命令行参数

Linux getopt/getopts解析命令行参数教程

ccf--20140303--命令行选项

allure命令行参数