运行C#代码报错StandardIn has not been redirected的求助
问题原因
当你通过Process.GetProcessById(procId)获取进程实例时,这个新实例并没有继承原进程启动时配置的标准输入输出重定向信息。GetProcessById返回的是进程的全新引用,它无法识别原进程启动时的StartInfo设置,因此访问StandardInput会触发"StandardIn has not been redirected"错误。
解决方案
直接传递原Process实例而非进程ID,这样能保留原有的流关联,避免重新获取进程导致的配置丢失。
修改后的代码示例
namespace test_cmd { internal class Program { static void Main(string[] args) { Process process = new Process(); process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = "cmd.exe"; // 让cmd启动后保持运行,避免直接退出 process.StartInfo.Arguments = "/k"; process.Start(); Console.WriteLine(RunCommand(process)); Console.ReadLine(); // 释放进程资源 process.Close(); } public static string RunCommand(Process process) { // 使用原进程实例操作标准输入 process.StandardInput.WriteLine("whoami"); process.StandardInput.Flush(); // 发送exit命令让cmd退出,否则ReadToEnd会持续阻塞 process.StandardInput.WriteLine("exit"); process.StandardInput.Flush(); // 读取完整输出 string output = process.StandardOutput.ReadToEnd(); // 等待进程退出 process.WaitForExit(); return output; } } }
关键说明
- 添加
/k参数:确保cmd启动后不会立即退出,否则无法后续发送命令。 - 发送
exit命令:ReadToEnd()会一直等待标准输出流关闭,cmd退出时才会关闭该流,这样才能获取到完整的命令输出。 - 调用
WaitForExit():确保进程完全退出后再返回结果,避免资源未释放的问题。
内容的提问来源于stack exchange,提问作者mesut yıldırım
相关产品推荐
相关产品推荐

