从C#向外部exe传递命令行参数

3

我跟已经在这里得到解决的问题相似。 但是我不知道问题是怎么解决的。我的程序接受参数,定义输入和输出文件。从命令行运行,一切正常:

D:\Tools\siftDemoV4>siftWin32.exe -display < D:\tmp\SrcPgm\image000.pbm > result.pbm

但是通过System.Diagnostics.Process运行不起作用。我会收到错误信息“无效的命令行参数:<”,然后会发生System.InvalidOperationException。

var process = new Process()
{
   StartInfo =
   {
     Arguments = string.Format(@"-display < {0} > {1}", configuration.Source,
       configuration.Destination),
     FileName = configuration.PathToExternalSift,
     RedirectStandardError = true,
     RedirectStandardInput = true,
     RedirectStandardOutput = true,
     UseShellExecute = false,
     CreateNoWindow = true,
     ErrorDialog = false,
   }
};

process.EnableRaisingEvents = true;
process.Exited += OnProcessExited;
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

我已经尝试在调用process.Start()后写入process.StandardInput,但是在使用调试器时,外部程序有时已经完成(HasExited==true)。

有人能解释一下如何将这些特殊的"<" ">"参数传递给程序吗?

最好的问候!

顺便说一句,我多次检查了路径,它们是正确的。


2
如果你已经阅读了其他线程,为什么不也阅读一下解决方案的答案呢?提示:它是第一段。为什么 <> 不起作用在最后一个段落中有解释。 - Nuffin
你的 < 之后的所有内容都不再是应用程序的参数,而是命令行处理器的“开关”(可以这么说)。 - user7116
1个回答

2
你只需要一个参数-display,其他不是程序的参数,应该通过使用RedirectStandardInputRedirectStandardOutput来处理。
例如:
  • 读取文件D:\tmp\SrcPgm\image000.pbm
  • 将其写入你的进程的StandardInput
  • 从你的进程的StandardOutput中读取
  • 将结果写入result.pbm
使用命令重定向运算符

好的,我尝试了这个,但现在我遇到了另一个错误:错误:输入不是标准的原始PGM文件。但我所做的一切都是process.StandardInput.Write(File.ReadAllBytes(sourceFile))和Flush()+Close()。我没有改变文件内容上的任何东西。 - 0xBADF00D
如果使用此链接解决了问题。该问题通过将文件读入一个字符串而不是一个字节数组来解决。有人知道为什么吗?感谢L.B. - 0xBADF00D

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