命令行参数参数限制
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.start
和 useshellexecute=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 秒。
【讨论】:
以上是关于命令行参数参数限制的主要内容,如果未能解决你的问题,请参考以下文章