记得在三年前,我们在做应用升级,选型了通过启动传参的方式,客户端通过传递参数给更新器 参数,执行应用升级。一开始更新的应用不多,参数的字符个数也是在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系统下的命令行参数的字符个数限制的更多相关文章

  1. Tools - Windows系统下的命令行工具Cmder

    cmder简介 官网:http://cmder.net/ GitHub:https://github.com/cmderdev/cmder Cmder是一个windows下的命令行工具,用来替代win ...

  2. Windows系统下用命令行编译C/C++程序过程总结

    转自:http://www.cnblogs.com/caikehe/archive/2013/01/12/2858017.html (1)先用记事本编写如下所示的代码,并另存为hello.cpp,假设 ...

  3. windows下cmd命令行显示UTF8字符设置(CHCP命令)

    本文由 www.169it.com 收集整理 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下 ...

  4. 在Windows系统下用命令把应用程序添加到系统服务

    在Windows系统下用命令把应用程序添加到系统服务,使用SC命令. 加入服务格式如下:sc create ServiceName binPath= 程序路径 start= auto(等号后面的空格是 ...

  5. Windows下解析命令行参数

    linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...

  6. 关于windows环境下cordova命令行无法启动adb.exe的解决办法

    使用phonegap开发手机APP,常常需要更改代码之后进行调试,使用安卓模拟器每次启动非常缓慢,而且不能保证最终在真机上的效果.所以一般都采用真机进行调试. 搭建真机的调试环境这里就不再赘述了,网上 ...

  7. Linux系统下Shell命令行快捷键实用技巧

    # Ctrl + A# Ctrl + E切到命令行开始|结尾 # esc+f往右跳一个词# esc+b往左跳一个词 # Ctrl + W清除光标之前一个单词# esc + d 删除光标后的一个词 # ...

  8. Windows系统下Dos命令记录

    # 切换到F:\test\目录 /d 参数可以直接切换,不需要先切换盘符 cd /d F:\test\ # 创建文件夹test md tset # 删除文件夹test rd test # 创建文件te ...

  9. Linux系统下通过命令行对mysql数据进行备份和还原

    一.备份 1.进入mysql目录 cd /var/lib/mysql (进入mysql目录,根据安装情况会有差别) 2.备份 mysqldump -u root -p密码 数据库名 数据表名 > ...

  10. windows系统下快捷命令

    mstsc 远程计算机 regedit 注册表

随机推荐

  1. selenium driver add_cookie正确姿势

    需求 seo给了个开发小需求,查询搜索引擎站点后台的索引量 需求分析 难点在于怎么绕过登录 技术选型 使用selenium+firefox+geckodriver执行抓取 技术难点解析 获取cooki ...

  2. CF contest 1935 Round 932 (Div. 2) A-D题解

    Codeforces Round 932 (Div. 2) A-D题解 Codeforces Round 932 (Div. 2) 绪言 很菜,AB速度慢,卡在C,想DP,但是时间优化不下来,说服自己 ...

  3. 阿里微服务解决方案-Alibaba Cloud之服务消费方(Feign)(四)

    一.创建服务消费方并集成OpenFeign 创建模块的方式与创建服务提供方的方式一致 目录结构如下 1.1 创建完项目后,加入 OpenFeign的依赖 在父工程的 pom.xml 文件中加入如下依赖 ...

  4. 鸿蒙 Native API 的封装库 h2lib_arkbinder

    h2lib_arkbinder 介绍 code: https://gitee.com/evanown/h2lib_arkbinder 本类库实现 C++ 代码到鸿蒙 Native API 的封装与转换 ...

  5. ArkUI-X跨平台应用改造指南

    现状与诉求 随着 HarmonyOS Next 5.0 版本正式发布,众多开发者基于 ArkTS 语言为 HarmonyOS Next 系统开发了大量应用,这极大地丰富了 HarmonyOS 的生态. ...

  6. 485 IO控制器转4G在智慧园区可视化监控平台中的应用

    1.行业背景 近些年来工业园区在中国大陆上如雨后春笋般崛起.取得良好效益的同时部分园区出现了一些意料之中的问题.比如传统园区面临的难题有1.人力成本的不断上涨2.能源浪费严重,节能降耗效率低3.安全问 ...

  7. 4G CAT1 DTU RS232/485转4G Modbus RTU转4G Modbus TCP RS232/485转MQTT DLT-645/RTU转云平台JSON

    4G CAT1 DTU   RS232/485转4G   Modbus RTU转4G Modbus TCP   RS232/485转MQTT   DLT-645/RTU转云平台JSON 高性价比的CA ...

  8. ORACLE--SQL日常问题和技巧2(自定义排序,递归查询,异常ORA-01747,逗号隔开的字符串转成in条件,用符号连接表中某字段)

    1.有些情况需要将几条记录按要求排序,适用于少量要求 表如图所示: 按照e,u,r,o,t,w,q,y,i顺序排序: 1 SELECT 2 * 3 FROM 4 LGQ_TEST 5 ORDER BY ...

  9. vmware15.5的解锁mac系统插件

    停止虚拟机服务 执行破解 进入插件MK-Unlocker-VM15.5目录内,右键以管理员权限运行win-install.cmd 查看效果 等待如上的脚本执行完成后,再打开vm,创建虚拟机,看看就有了 ...

  10. 【8*】动态DP学习笔记

    前言 WC 2024 的知识点,补个档.寒假时间紧促,这篇博客是边学边写的. 此类知识点大纲中并未涉及,所以[8]是我自己的估计,后带星号表示估计,仅供参考. 动态 DP 动态 DP 用于解决需要求出 ...