我正在编写批处理文件并通过C#程序执行它。
编写批处理文件:
我将从app.config获取Path,Executable名称和参数,并将它们写入批处理文件。
执行批处理文件:
编写批处理文件后,我将文件名传递给下面的函数,该函数执行批处理文件以启动应用程序。
问题:
我的程序会编写很多批处理文件,这些批处理文件会在每个文件写入后立即执行。我发现,有些时候应用程序没有启动,这意味着批处理文件不会被执行。我甚至没有收到任何错误消息或提示批处理文件执行失败。
预期解决方案:
执行批处理文件时出现任何问题,我应该能够记录它或提示错误。
执行批处理文件的代码:
System.Diagnostics.ProcessStartInfo procinfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
procinfo.UseShellExecute = false;
procinfo.RedirectStandardError = true;
procinfo.RedirectStandardInput = true;
procinfo.RedirectStandardOutput = true;
System.Diagnostics.Process process = System.Diagnostics.Process.Start(procinfo);
System.IO.StreamReader stream = System.IO.File.OpenText(BatchPath + LatestFileName);
System.IO.StreamReader sroutput = process.StandardOutput;
System.IO.StreamWriter srinput = process.StandardInput;
while (stream.Peek() != -1)
{
srinput.WriteLine(stream.ReadLine());
}
Log.Flow_writeToLogFile("Executed .Bat file : " + LatestFileName);
stream.Close();
process.Close();
srinput.Close();
sroutput.Close();
答案 0 :(得分:1)
我不确定你的问题在哪里,但我对以下代码没有任何问题:
using (FileStream file = new FileStream("xyz.cmd", FileMode.Create)) {
using (StreamWriter sw = new StreamWriter(file)) {
sw.Write("@echo ====================\n");
sw.Close();
}
}
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "xyz.cmd";
//p.StartInfo.RedirectStandardOutput = true;
p.Start();
//String s = p.StandardOutput.ReadLine();
//while (s != null) {
// MessageBox.Show(s);
// s = p.StandardOutput.ReadLine();
//}
p.WaitForExit();
显然为了隐藏我的“秘密酱”而被削减了一点,但这个代码目前正在生产中使用而没有问题。
我有一个问题。为什么不直接执行cmd
文件而不是运行cmd.exe
?
我要做的第一件事就是打印出BatchPath + LatestFileName
值,看看你是否创建了任何奇怪命名的文件,这些文件会阻止cmd.exe
运行它们。