You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms自更新应用执行带延迟Cmd命令,新exe无法获取参数

解决自更新应用启动新exe时参数被忽略的问题

你的问题核心是命令行引号的包裹范围错误:你把目标程序gestion.exe和所有参数放在了同一个双引号内,CMD会将整个字符串识别为程序文件名,而非将后面的内容当作参数解析。

修正CMD中转的写法

调整引号位置,将程序路径单独包裹,参数单独处理(注意带空格的参数需要单独加引号,避免被CMD拆分):

ProcessStartInfo testProcess = new ProcessStartInfo();
// 处理每个参数:带空格的参数单独添加引号
var formattedArgs = args.Select(arg => 
    arg.Contains(" ") ? $"\"{arg}\"" : arg
);
var argsString = string.Join(" ", formattedArgs);

testProcess.Arguments =
    $"/C choice /C Y /N /D Y /T 5 & cd \"{datos.RUTA_INSTALACION_LOCAL}/app\" " +
    $"& \"gestion.exe\" {argsString} & choice";
testProcess.WindowStyle = ProcessWindowStyle.Normal;
testProcess.ErrorDialog = true;
testProcess.CreateNoWindow = false;
testProcess.FileName = "cmd.exe";
Process.Start(testProcess);

更简洁的方案:直接启动目标程序

不需要通过CMD中转,直接使用ProcessStartInfo启动程序,能避免CMD的命令解析问题,写法更规范:

ProcessStartInfo updateProcess = new ProcessStartInfo();
// 拼接目标程序的完整路径
updateProcess.FileName = Path.Combine(datos.RUTA_INSTALACION_LOCAL, "app", "gestion.exe");
// 格式化参数,处理带空格的情况
updateProcess.Arguments = string.Join(" ", 
    args.Select(arg => arg.Contains(" ") ? $"\"{arg}\"" : arg)
);
// 设置程序的工作目录
updateProcess.WorkingDirectory = Path.Combine(datos.RUTA_INSTALACION_LOCAL, "app");
updateProcess.WindowStyle = ProcessWindowStyle.Normal;
updateProcess.ErrorDialog = true;

Process.Start(updateProcess);

这种方式直接通过FileName指定程序路径,Arguments传递参数,.NET会自动处理参数的引号逻辑,比CMD中转更可靠。

内容的提问来源于stack exchange,提问作者Windgate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:05:04