Visual Studio x86 tools, normal cmd.exe, Process.Start()

本文关键字:Process Start exe normal Studio x86 tools Visual cmd | 更新日期: 2023-09-27 18:36:36

我需要编写一些代码来调用 C# 中的 tesseract OCR。我安装了它并使用以下代码。但它不起作用:

  ProcessStartInfo startInfo = new ProcessStartInfo();
  startInfo.FileName = "cmd.exe";
  startInfo.WorkingDirectory = tempDir.FullName;
  // doesn't work
  startInfo.Arguments = string.Format("/C tesseract {0} {1}", imgName, textName);
  // this works
  //startInfo.Arguments = string.Format("/C copy {0} {1}", imgName, textName);
  Process p = new Process();
  p.StartInfo = startInfo;
  p.Start();
  p.WaitForExit();
  p.Close();

不会引发异常或错误。我只是无法在目录中获取输出文件。我尝试使用内置命令,例如注释的copy,并且可以工作。我试图获取进程的标准输出,但它总是抛出"进程退出"异常。

之后,我尝试在命令窗口中调用 tesseract。我进入临时目录,运行tesseract img.png output,这里发生了有趣的事情:

  1. 当通过 Start->Run->cmd 启动命令窗口时,它工作正常。
  2. 在Visual Studio解决方案资源管理器中启动命令窗口时,右键单击>打开命令提示符(这是VS Productivity Power Tools的一项功能),它显示"tesseract未被识别为内部或外部命令"。

我检查了环境变量中的 PATH,它是正确的。我能看到的唯一区别是VS提示符在顶部显示"设置使用Microsoft Visual Studio 2010 x86工具的环境"。它不是搜索 PATH 变量来查找命令吗?它们不是一回事吗?它是否与我的 C# 代码的失败有关?

我的操作系统是 Windows Server 2008 64 位。

Visual Studio x86 tools, normal cmd.exe, Process.Start()

我以不同的方式使用它,如下所示:

Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.FileName = "tesseract.exe";
p.StartInfo.Arguments = string.Format("'"{0}'" '"{1}'" -l {2} -psm {3} {4}", imageFile, outputFileName, language, PageSegMode, Hocr ? "hocr" : string.Empty);
p.Start();
p.WaitForExit();
if (p.ExitCode == 0)
{
   // read output text file
}
p.Close();