语言:C# 我必须传递一个巨大的字符串数组(动态构建)作为运行exe的参数。 我想通过以下两种方式实现它。但我并不自信。
我可以将其创建为由空格分隔的一个字符串。我可以通过Process.Start调用exe。 因此,正在运行的子进程会考虑空间并将其保存为字符串数组。 但是我不确定字符串数组的限制。假设我的字符串数组计数超过10,000
我可以将它创建为一个由特殊符号分隔的字符串,该符号永远不会落入数据中。我可以用字符串调用exe。正在运行的子进程将其视为一个单独的字符串,我可以使用相同的分隔符将其拆分以获取字符串数组。但是,在这里我不确定命令大小。如果命令行字符串长度很大,那么这样做
任何人都可以帮助我告诉我参数大小限制
答案 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:
答案 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秒钟。