如何使用C#调用cmd切换目录并执行slp importtextfile导入命令
问题排查&修复方案
存在的核心问题:
- 命令参数的短横线符号错误:你代码里的
–u、–c用的是全角破折号,cmd只能识别半角减号-作为参数前缀,符号不匹配会导致slp命令无法识别参数 - 冗余且无效的
SendKeys.SendWait("{ENTER}")调用:StandardInput.WriteLine本身就会自动追加换行符,不需要额外发送回车;而且SendKeys是向当前系统活动窗口发送按键,你创建的是无窗口后台运行的cmd进程,按键根本无法到达目标进程 - 没有向cmd发送退出指令:执行完目标命令后,cmd进程不会主动退出,调用
StandardOutput.ReadToEnd()会一直阻塞等待进程结束,导致程序卡住 - cd命令可以省略:Process类支持直接配置工作目录,不需要手动执行cd切换目录
修正后可运行的代码:
using (Process myProcess = new Process()) { myProcess.StartInfo.FileName = "cmd.exe"; myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.RedirectStandardOutput = true; myProcess.StartInfo.RedirectStandardInput = true; myProcess.StartInfo.CreateNoWindow = true; // 直接配置工作目录,不需要手动执行cd命令 myProcess.StartInfo.WorkingDirectory = @"C:\SLP\SLP5\"; myProcess.Start(); // 参数使用半角减号,执行完命令后发送exit让cmd主动退出 myProcess.StandardInput.WriteLine(@"slp importtextfile -u -c -n -fplu C:\SLP\SLP5\Update.csv"); myProcess.StandardInput.WriteLine("exit"); string s = myProcess.StandardOutput.ReadToEnd(); textBox1.Text = s; myProcess.WaitForExit(); var exitCode = myProcess.ExitCode; myProcess.Close(); }
更简化的写法
直接把命令作为/c的参数传给cmd,不需要重定向标准输入:
using (Process myProcess = new Process()) { myProcess.StartInfo.FileName = "cmd.exe"; // /c参数表示执行完指定命令后自动退出cmd myProcess.StartInfo.Arguments = @"/c ""slp importtextfile -u -c -n -fplu C:\SLP\SLP5\Update.csv"""; myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.RedirectStandardOutput = true; myProcess.StartInfo.CreateNoWindow = true; myProcess.StartInfo.WorkingDirectory = @"C:\SLP\SLP5\"; myProcess.Start(); string s = myProcess.StandardOutput.ReadToEnd(); textBox1.Text = s; myProcess.WaitForExit(); var exitCode = myProcess.ExitCode; }
内容的提问来源于stack exchange,提问作者Thapelo
相关产品推荐
相关产品推荐

