从C#运行批处理文件

更新 **仍然正在寻找一个正确的答案**我的Windows服务中有以下代码,我想运行一个批处理文件。 我想要命令提示窗口,以便我可以看到进度

这是我的代码,但我的批处理文件代码不起作用

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.IO; namespace Watcher { public partial class Watcher : ServiceBase { public Watcher() { InitializeComponent(); FolderWatcher.Created += FolderWatcher_Created; FolderWatcher.Deleted += FolderWatcher_Deleted; FolderWatcher.Renamed += FolderWatcher_Renamed; } protected override void OnStart(string[] args) { // Start the child process. Process p = new Process(); // Redirect the output stream of the child process. p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "C:\\myFile.bat"; p.Start(); // Do not wait for the child process to exit before // reading to the end of its redirected stream. // p.WaitForExit(); // Read the output stream first and then wait. string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); } protected override void OnStop() { } private void FolderWatcher_Created(object sender, System.IO.FileSystemEventArgs e) { TextWriter writer = new StreamWriter("C:\\folder\\FolderLog.txt", true); writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been created. "); writer.Close(); } private void FolderWatcher_Deleted(object sender, System.IO.FileSystemEventArgs e) { TextWriter writer = new StreamWriter("C:\\folder\\FolderLog.txt", true); writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been deleted. "); writer.Close(); } private void FolderWatcher_Renamed(object sender, System.IO.RenamedEventArgs e) { TextWriter writer = new StreamWriter("C:\\folder\\log.txt", true); writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been renamed. "); writer.Close(); } } } 

它不执行批处理文件。 我是.net和C#的新手,我不知道该怎么做。 谢谢

如何从Windows服务运行控制台应用程序?

您将要设置p.StartInfo与FileName =“cmd.exe”和Arguments =“c:\\ thebatfile.bat”我相信

问题是您将UseShellExecute为false,但您没有传递可执行文件的名称。

当使用ShellExecute ,它类似于双击资源管理器中的文件 – 它知道需要使用Word打开.doc文件,并且需要使用cmd.exe打开.bat文件。 如果您已将此禁用,但它不知道这些内容,您需要传递可执行文件才能成功运行任何内容。

当您将RedirectStandardOutput设置为true时,您需要通过将FileName设置为cmd.exe并将参数设置为/C "c:\myFile.bat"来通过cmd.exe运行批处理文件:

 p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/C \"c:\\myFile.bat\""; 

看起来它在首次运行服务时运行批处理脚本,然后在其他函数被调用之前退出( p.WaitForExit(); )。 这是预期的行为吗? 这可以解释为什么你可以看到它执行文件夹操作而不是看到正在运行的脚本。

尝试使用此代码调出控制台窗口。 它应该让您了解批处理脚本何时运行。

 protected override void OnStart(string[] args) { // Start the child process. Process p = new Process(); // Redirect the output stream of the child process. p.StartInfo.UseShellExecute = false; /* This is commented out so we can see what the script is doing inside the cmd console. */ //p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "C:\\myFile.bat"; p.Start(); // Do not wait for the child process to exit before // reading to the end of its redirected stream. // p.WaitForExit(); // Read the output stream first and then wait. /* Since we aren't redirecting the output, we have to comment out this line or we get an error */ //string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); } 

我怀疑你的服务或蝙蝠文件。 修改源代码打开记事本! 检查记事本是否显示!! 如果是,那么我们可以进一步调查!

你的批处理文件在做什么? 假设您已确认此IS正常运行。

Windows服务在无桌面用户帐户下运行。 要查看cmd窗口,您必须模拟当前登录的用户并在此用户的桌面上启动cmd窗口。 看到这个:

来自C#的Windows模拟