在C#中运行relog命令无输出,CMD运行正常,求排查原因
这种情况我之前调试的时候也碰到过,大概率是几个容易忽略的小问题导致的,咱们一个个来排查解决:
可能的原因及解决方案
1. CMD命令参数格式错误(最常见)
你直接把relog.exe sample.blg作为cmd.exe的参数是不对的——CMD不会自动执行这个命令,得加上/c参数明确告诉它:执行完指定命令后就退出。
修正后的参数应该写成:
Arguments = "/c relog.exe sample.blg"
2. 没有等待进程完成就读取输出
从你的代码片段看,只写了string result ...,如果没调用process.WaitForExit(),进程还在运行的时候就去读取输出,大概率拿不到完整内容甚至是空值。
正确的流程是启动进程后,先读取输出(或者先等进程结束,不过推荐先读输出避免缓冲区满导致进程挂起):
process.Start(); // 先读输出再等退出,防止缓冲区溢出 string result = process.StandardOutput.ReadToEnd(); process.WaitForExit();
3. 没有重定向错误输出
Relog很可能会把错误信息、甚至部分正常输出写到**标准错误流(StandardError)**里,而你只重定向了StandardOutput,导致看不到执行结果,甚至进程因为错误流缓冲区满而卡住。
建议同时开启错误流重定向,并读取它的内容,方便排查问题:
StartInfo = new ProcessStartInfo { FileName = "cmd.exe", WorkingDirectory = @"C:\blgs", Arguments = "/c relog.exe sample.blg", RedirectStandardOutput = true, RedirectStandardError = true, // 新增这行 UseShellExecute = false, CreateNoWindow = true, }
然后读取错误输出:
string output = process.StandardOutput.ReadToEnd(); string errorMsg = process.StandardError.ReadToEnd(); process.WaitForExit(); // 打印错误信息,方便排查问题 if (!string.IsNullOrEmpty(errorMsg)) { Console.WriteLine($"Relog执行出错: {errorMsg}"); }
4. 权限或路径问题
- 检查你的C#程序运行权限是否和手动打开CMD时一致:比如手动CMD是管理员身份,而程序没以管理员运行,可能导致Relog无法访问文件或执行操作。
- 确认
relog.exe在系统PATH里,或者直接写绝对路径(比如C:\Windows\System32\relog.exe),避免CMD找不到命令。 - 确认
sample.blg确实在C:\blgs目录下,或者给Relog指定完整的文件路径(比如relog.exe C:\blgs\sample.blg)。
修正后的完整代码示例
public static string RunRelogCommand() { var process = new Process() { StartInfo = new ProcessStartInfo { FileName = "cmd.exe", WorkingDirectory = @"C:\blgs", Arguments = "/c relog.exe sample.blg", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, } }; process.Start(); string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); // 有错误就打印出来,方便调试 if (!string.IsNullOrWhiteSpace(error)) { Console.WriteLine($"Relog执行错误: {error}"); } return output; }
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

