记录一下Windows系统下的命令行参数的字符个数限制
记得在三年前,我们在做应用升级,选型了通过启动传参的方式,客户端通过传递参数给更新器 参数,执行应用升级。一开始更新的应用不多,参数的字符个数也是在1000以内,没有发现问题。后来随着全家桶应用的新增,应用个数越来越多,直到在一个测试升级的时候,测试手动写了一万多个字符的更新的描述。执行升级直接异常了。
1、查阅了微软的官方文档,命令提示符行字符串限制 - Windows Client | Microsoft Learn,有如下的说明:
以下示例演示如何将此限制应用于在命令提示符中运行的命令以及批处理文件中使用的命令。
在命令提示符中,以下命令行的总长度不能超过 8191 个字符:
cmd.exe /k ExecutableFile.exe parameter1, parameter2... parameterN
在批处理文件中,以下命令行的总长度不能超过 8191 个字符:
cmd.exe /k ExecutableFile.exe parameter1, parameter2... parameterN
此限制适用于使用命令提示符运行批处理文件时包含在批处理文件中的命令行。
在命令提示符中,展开
EnvironmentVariable2EnvironmentVariable3后的总长度EnvironmentVariable1不能超过 8191 个字符:c:> set EnvironmentVariable1 = EnvironmentVariable2 EnvironmentVariable3
在批处理文件中,展开参数后以下命令行的总长度不能超过 8191 个字符:
ExecutableFile.exe parameter1 parameter2
尽管环境变量的 Win32 限制为 32,767 个字符,但命令提示符会忽略从父进程继承的任何环境变量,并且比自身限制 8191 个字符(适用于操作系统)长。 有关函数
SetEnvironmentVariable的详细信息,请参阅 SetEnvironmentVariableA 函数。
2、准备工作:先实现一个控制台程序 CmdConsoleApp,供进程启动调用
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!"); if (args.Length <= 0)
{
Console.WriteLine($"没有输入参数");
return;
}
Console.WriteLine($"输入参数个数: {args.Length}");
foreach (var arg in args)
{
Console.WriteLine($"参数为: {arg}");
Console.WriteLine($"参数的长度为:{arg.Length}");
}
3、对于以上的微软官网的说明,我们使用的方式是父进程启动子进程的方式,给升级器进程传递参数的,这个限制是由操作系统的CreateProcess函数决定的也就是总长度不能超过 32,767字符长度,代码如下:
// See https://aka.ms/new-console-template for more information using System.Diagnostics;
using System.Text; var cmdConsoleAppPath = @$"E:\Code\wutyDemo\CmdConsoleApp\bin\Debug\net8.0\CmdConsoleApp.exe";
var pathLength = cmdConsoleAppPath.Length;
StringBuilder sb = new StringBuilder();
var count = 32767 - pathLength; sb = new StringBuilder();
for (int i = 0; i < count; i++)
{
sb.Append("1");
} Process.Start(cmdConsoleAppPath, sb.ToString());
3.1、执行结果如下,直接报文件名太长:

3.2、如果适当调低打印的总的个数参数,如 32763的个数,是可以正常打印:

4、cmd 控制台命令行参数:从上方的官方文档可以看出,如果调用 cmd.exe 的方式,命令行的总长度不能超过 8191 个字符
// See https://aka.ms/new-console-template for more information using System.Diagnostics;
using System.Text; var cmdConsoleAppPath = @$"E:\Code\wutyDemo\CmdConsoleApp\bin\Debug\net8.0\CmdConsoleApp.exe";
var pathLength = cmdConsoleAppPath.Length; StringBuilder sb = new StringBuilder();
var cmdFileName = "cmd.exe";
var processArgs1 = $"/k {cmdConsoleAppPath} "; var cmdParmamterCount = 8191 - cmdFileName.Length - processArgs1.Length;
for (int i = 0; i < cmdParmamterCount; i++)
{
sb.Append("1");
}
processArgs1 += sb.ToString(); using Process process = new Process(); // 2. 配置启动信息
process.StartInfo = new ProcessStartInfo
{
FileName = cmdFileName, // 调用命令提示符
Arguments = processArgs1, // 执行命令参数
};
process.Start();
4.1、控制台打印如下图所示:

4.2、如果适当调低打印的总的个数参数,如 8188的个数,是可以正常打印:

5、如何解决限制
若要解决此限制,请根据情况使用以下一个或多个方法:
修改需要长命令行的程序,以便它们使用包含参数信息的文件,然后在命令行中包含文件的名称。
例如,不要在批处理文件中使用
ExecutableFile.exe Parameter1 Parameter2... ParameterN命令行,而是修改程序以使用类似于以下命令行的命令行,其中 ParameterFile 是包含所需参数的文件(parameter1 parameter2...ParameterN):ExecutableFile.exe c:\temp\ParameterFile.txt
修改使用大型环境变量的程序,以便环境变量包含少于 8191 个字符。
例如,如果 PATH 环境变量包含的字符数超过 8191 个字符,请使用以下一个或多个方法来减少字符数:
- 对文件夹和文件使用较短的名称。
- 减少文件夹树的深度。
- 将文件存储在较少的文件夹中,以便 PATH 环境变量中需要更少的文件夹。
- 调查可用于减少 PATH 依赖项以查找.dll文件可能的方法。
记录一下Windows系统下的命令行参数的字符个数限制的更多相关文章
- Tools - Windows系统下的命令行工具Cmder
cmder简介 官网:http://cmder.net/ GitHub:https://github.com/cmderdev/cmder Cmder是一个windows下的命令行工具,用来替代win ...
- Windows系统下用命令行编译C/C++程序过程总结
转自:http://www.cnblogs.com/caikehe/archive/2013/01/12/2858017.html (1)先用记事本编写如下所示的代码,并另存为hello.cpp,假设 ...
- windows下cmd命令行显示UTF8字符设置(CHCP命令)
本文由 www.169it.com 收集整理 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下 ...
- 在Windows系统下用命令把应用程序添加到系统服务
在Windows系统下用命令把应用程序添加到系统服务,使用SC命令. 加入服务格式如下:sc create ServiceName binPath= 程序路径 start= auto(等号后面的空格是 ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- 关于windows环境下cordova命令行无法启动adb.exe的解决办法
使用phonegap开发手机APP,常常需要更改代码之后进行调试,使用安卓模拟器每次启动非常缓慢,而且不能保证最终在真机上的效果.所以一般都采用真机进行调试. 搭建真机的调试环境这里就不再赘述了,网上 ...
- Linux系统下Shell命令行快捷键实用技巧
# Ctrl + A# Ctrl + E切到命令行开始|结尾 # esc+f往右跳一个词# esc+b往左跳一个词 # Ctrl + W清除光标之前一个单词# esc + d 删除光标后的一个词 # ...
- Windows系统下Dos命令记录
# 切换到F:\test\目录 /d 参数可以直接切换,不需要先切换盘符 cd /d F:\test\ # 创建文件夹test md tset # 删除文件夹test rd test # 创建文件te ...
- Linux系统下通过命令行对mysql数据进行备份和还原
一.备份 1.进入mysql目录 cd /var/lib/mysql (进入mysql目录,根据安装情况会有差别) 2.备份 mysqldump -u root -p密码 数据库名 数据表名 > ...
- windows系统下快捷命令
mstsc 远程计算机 regedit 注册表
随机推荐
- ChatMoney让你变成HR高手!
本文由 ChatMoney团队出品 在快节奏的现代职场中,招聘是每一个企业都绕不开的重要环节.然而,传统的招聘流程往往繁琐而低效,从海量简历的筛选,再到后续的评估与决策,每一个环节都耗费着HR人员大量 ...
- 你应该懂的AI大模型(六)之 transformers
一.Transformer与transformers 结论:Transformer是模型架构,transfortmers是库. 问:为什么我们要知道Transformer与transformers呢? ...
- js代码修改react框架的input的值-2025年6月
需求,在1688商家工作台中的发布助手页面中,设置了模版依旧会有些输入框内容要自己填写,太麻烦了. 比如下面中的可售数量 想着自己写了个脚本方便自己填充数据. 试着尝试直接修改input标签的valu ...
- ChunJun框架在数据还原上的探索和实践 | Hadoop Meetup精彩回顾
Hadoop是Apache基金会旗下最知名的基础架构开源项目之一.自2006年诞生以来,逐步发展成为海量数据存储.处理最为重要的基础组件,形成了非常丰富的技术生态. 作为国内顶尖的 Hadoop 开源 ...
- HyperWorks分析模型的建立与边界条件施加
在HyperWorks完成了基本的网格剖分后,还需要赋予模型各类与求解相关的信息,方能最终生成可以递交求解器计算的输入文件.分析模型的建立与载荷及边界条件的创建包括以下内容: -定义待输出的目标求解器 ...
- JQ原生 Ajax请求
现在的前端请求.真的是百花齐放,但是老古董ajax 还是挺好用的,主要是简单的 $.ajax({ type: "Post", ...
- Visual Studio2019 的 Git增加忽略文件
https://www.cnblogs.com/wucg/archive/2011/08/16/2141647.html Git增加忽略文件 如果是第一次,在提交得时候选择要忽略得文件就行, 如果已经 ...
- 移动设备控制网络IO模块案例
网络IO模块设备配置画面一 首先ip模式设置为动态获取,工作模式设置为tcp客户端模式,目的ip或域名设置为47.95.144.92,目的端口设置为9797,波特率设置为115200,这是这个页面需要 ...
- java基础--自定义异常类、包、模板模式
自定义异常类 需求: 模拟feiQ上线的时候,如果没有插上网线,那么就抛出一个没有插上网线的异常, 如果已经插上了网上,那么就正常显示好友列表. 自定义异常类的步骤: 自定义一个类继承Exceptio ...
- Electron初始化项目并打包
初始化项目初始化项目用模板就行 # 克隆这仓库 $ git clone https://github.com/electron/electron-quick-start # 进入仓库 $ cd ele ...