process.Start()时出现“系统找不到指定的文件”错误。

9
我正在尝试将进程响应作为字符串获取,以便在代码的不同位置使用它,这是目前我拥有的解决方案:
const string ex1 = @"C:\Projects\MyProgram.exe ";
      const string ex2 = @"C:\Projects\ProgramXmlConfig.xml";


      Process process = new Process();
      process.StartInfo.WorkingDirectory = @"C:\Projects";
      process.StartInfo.FileName = "MyProgram.exe ";
      process.StartInfo.Arguments = ex2;
      process.StartInfo.Password = new System.Security.SecureString();
      process.StartInfo.UseShellExecute = false;
      process.StartInfo.RedirectStandardOutput = true;  

      try
      {
          process.Start();
          StreamReader reader = process.StandardOutput;
          string output = reader.ReadToEnd();
      }
      catch (Exception exception)
      {
          AddComment(exception.ToString());
      }

但是当我运行这个代码时,出现了以下错误:

"The system cannot find the file specified" error in process.Start(); without 
      process.StartInfo.UseShellExecute = false;
      process.StartInfo.RedirectStandardOutput = true;  

这段代码运行正常,但只是打开了控制台窗口,所有进程的响应都被丢到那里,所以我无法将其用作字符串。

有人知道我为什么会出现这个错误,或者有不同的解决方案吗?

2个回答

20

我怀疑问题出在您指定的文件名是相对于您的工作目录的,而且您希望 Process.Start 在启动进程时查找该目录 - 我不认为当 UseShellExecutefalse 时会以这种方式工作。尝试只指定要启动的进程的绝对文件名:

process.StartInfo.FileName = @"C:\Projects\MyProgram.exe";
请注意,我还从您为 FileName 属性分配的字符串末尾删除了空格-这很可能也是问题的原因。

@DariaShalimov 如果这是你问题的答案,请标记为答案。 - Jamaxack
@DariaShalimov:在左边答案的分数旁应该有一个勾选标记 - 只需单击该勾选标记即可接受答案。 - Jon Skeet
1
你能否更详细地解释一下为什么将 UseShellExecute 设置为 false 会改变 WorkingDirectory 的行为?我期望如果我设置了工作目录和文件名,它会使用工作目录来执行该文件。 - John Grabanski
UseShellExecute 的文档中可以了解到:“WorkingDirectory 属性的行为取决于 UseShellExecute 属性的值。当 UseShellExecute 为 true 时,WorkingDirectory 属性指定可执行文件的位置。如果 WorkingDirectory 是空字符串,则默认当前目录包含可执行文件。” - Jon Skeet

6

如果您正在尝试在x64上运行x86应用程序并访问System32,则必须在文件名中使用“Sysnative”关键字,而不是“System32”。

例如:

C:\Windows\System32\whoiscl.exe

应改为:

C:\Windows\Sysnative\whoiscl.exe

希望这对某人有所帮助


它肯定帮助了我! - foxx1337
@foxx1337 我很高兴它在4年后终于能够工作了。 - f4r4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接