命令行参数参数限制

时间:2012-02-02 15:47:45

标签: c# command-line command-line-arguments

语言:C# 我必须传递一个巨大的字符串数组(动态构建)作为运行exe的参数。 我想通过以下两种方式实现它。但我并不自信。

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

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

  3. 任何人都可以帮助我告诉我参数大小限制

8 个答案:

答案 0 :(得分:17)

这取决于操作系统:

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

  

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

(强调我的)

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

对大型数组使用命令行参数并不是一个好习惯。将您的参数放在配置文件中,只需将文件名作为命令行参数传递。

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

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

答案 5 :(得分:1)

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

我发现了这个:

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

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

希望得到这个帮助。

答案 6 :(得分:0)

答案 7 :(得分:0)

如果可以直接从父进程启动子进程(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秒钟。