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
相关产品推荐
相关产品推荐

