Cos*_*smo 0 .net c# command-line command process
我从命令行使用本机Windows应用程序spamc.exe(SpamAssassin - sawin32),如下所示:
C:\ SpamAssassin\spamc.exe -R <C:\ email.eml
现在我想从C#调用这个过程:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = @"C:\SpamAssassin\spamc.exe";
p.StartInfo.Arguments = @"-R";
p.Start();
p.StandardInput.Write(@"C:\email.eml");
p.StandardInput.Close();
Console.Write(p.StandardOutput.ReadToEnd());
p.WaitForExit();
p.Close();
Run Code Online (Sandbox Code Playgroud)
上面的代码只是将文件名作为字符串传递给spamc.exe(不是文件的内容).但是,这个工作:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = @"C:\SpamAssassin\spamc.exe";
p.StartInfo.Arguments = @"-R";
p.Start();
StreamReader sr = new StreamReader(@"C:\email.eml");
string msg = sr.ReadToEnd();
sr.Close();
p.StandardInput.Write(msg);
p.StandardInput.Close();
Console.Write(p.StandardOutput.ReadToEnd());
p.WaitForExit();
p.Close();
Run Code Online (Sandbox Code Playgroud)
如果我读取文件并将内容传递给spamc,有人会指出我为什么会工作,但是如果我只是像在Windows命令行中那样传递文件名,那么它是不行的?
它在命令行上的原因<是一个小魔术参数.它只是做了一点点,然后你可能会期待.实际上,它会打开文件并将其内容放入流程的标准输入中.因此,在使用Process类时必须手动执行此操作.
正如您在第二个示例中所示,您必须使用StreamReader来获取文件的内容并将其放入StandardInput.为了使它更强大,你可以使用这个小代码片段:
using (var streamReader = new StreamReader(fileInfo.FullName))
{
process.StandardInput.Write(streamReader.ReadToEnd());
process.StandardInput.Flush();
}
Run Code Online (Sandbox Code Playgroud)