(C#) 调用执行批处理文件

Task:  在Windows的Service里面定时的调用执行一个批处理文件。


       private ApplicationOutput RunCommandOnPC(string executablePath, string args, string workingFolder, bool ignoreErrorCode)
{
if (!Path.IsPathRooted(executablePath))
{
string executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
executablePath = Path.Combine(executingDirectory, executablePath);
}
// 显示Dos窗口,观察执行情况。
//using (Process process = new Process())
//{
// process.StartInfo = new ProcessStartInfo(executablePath, args);
// process.StartInfo.UseShellExecute = true;

// process.Start();
// process.WaitForExit();
//}
//return null;

using (Process process = new Process())
{
process.StartInfo = new ProcessStartInfo(executablePath, args);
if (workingFolder != null)
{
process.StartInfo.WorkingDirectory = workingFolder;
}

process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
StringBuilder stdOutput = new StringBuilder();
StringBuilder stdError = new StringBuilder();

using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
{
process.OutputDataReceived += (sender, e) =>
{
if (e.Data != null)
{
stdOutput.AppendLine(e.Data);
}
else
{
outputWaitHandle.Set();
}
};

process.ErrorDataReceived += (sender, e) =>
{
if (e.Data != null)
{
stdError.AppendLine(e.Data);
}
else
{
errorWaitHandle.Set();
}
};

string processOutput = string.Empty;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

if (process.WaitForExit((int)this.defaultTimeout.TotalMilliseconds)
&& outputWaitHandle.WaitOne((int)this.defaultTimeout.TotalMilliseconds)
&& errorWaitHandle.WaitOne((int)this.defaultTimeout.TotalMilliseconds))
{
// Process is completed.
processOutput = stdOutput.ToString() + stdError.ToString();
if (!ignoreErrorCode && process.ExitCode != 0)
{
throw new Exception(string.Format("{0} {1}, ExitCode {2}, Args {3}.", executablePath, args, process.ExitCode, processOutput));
}
}
else
{
throw new Exception(string.Format("Process running is time out in {0}.", (int)this.defaultTimeout.TotalMilliseconds));
}

return new ApplicationOutput
{
ReturnValue = (uint)process.ExitCode,
Output = processOutput
};

}
}

调用程序的时候,需要用 cmd.exe /c


 string dosCommand = @"c:\windows\system32\cmd.exe";
string batchFileName = @"test.bat";
string workingFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string args = string.Format(@"/C {0}\{1} /Y", workingFolder, batchFileName);

var output = this.RunCommandOnPC(dosCommand, args, workingFolder, false);

(C#) 调用执行批处理文件

时间: 2024-10-02 06:55:02

(C#) 调用执行批处理文件的相关文章

WinRAR 自动解压 解压完成后,执行批处理文件

部分内容参考网页:http://bbs.kafan.cn/thread-1243208-1-1.html WinRAR 的自动解压文件功能使压缩包也能像 Setup 程序那样,双击后显示一个软件许可,然后自动在指定位置解压文件,最后自动执行软件. ·软件解密包——软件解密需要将很多文件拷贝到安装目录覆盖原文件,烦琐的操作非常适合制作自动解密包 ·自动演示包——用 PowerPoint 打包功能会生成众多文件,做成自动演示包后,方便文稿的演示与文件的管理  ·客户资料包——当您的客户不太懂电脑时,

12mybatis调用执行存储过程

mybatis 调用执行存储过程 mysql 声明建立存储过程 删除 在mysql中调用 -- 声明定义存储过程 delimiter $$ create procedure delbook(id int) begin delete from book where book_id=id; end$$ delimiter ; -- 删除存储过程 drop procedure delbook; -- 调用执行存储过程 call delbook(4); select * from book; mybat

PHP通过反射方法调用执行类中的私有方法

PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包含了一个名为myFun的私有方法class MyClass {        private $tmp = 'hello';        private function myFun()    {        echo $this->tmp . ' ' . 'world!';    }} //通过类

用ruby调用执行shell命令

碰到需要调用操作系统shell命令的时候,Ruby为我们提供了六种完成任务的方法: 1.Exec方法: Kernel#exec方法通过调用指定的命令取代当前进程: 例子: $ irb      >> exec 'echo "hello $HOSTNAME"'         hello nate.local      $值得注意的是,exec方法用echo命令来取代了irb进程从而退出了irb.主要的缺点是,你无法从你的ruby脚本里知道这个命令是成功还是失败. 2.Sys

rpyc + plumbum 实现远程调用执行shell脚本

rpyc可以很方便实现远程方法调用, 而plumbum则可以实现在python中类似shell的方式编码: 具体实现代码如下: Server.py import rpyc from rpyc.utils.server import ThreadedServer from plumbum import local from plumbum.cmd import sh class CalculatorService(rpyc.Service): """根据路径和脚本名执行脚本 :

setTimeout()和setInterval() 何时被调用执行

定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除. 从定义上我们可以看到两个函数十分类似,只不过前者执行一次,而后者可以执行多次,两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒数. 很简单的定义,使用起来也很简单,但有时候我们的代码并不是按照我们

setTimeout()和setInterval() 何时被调用执行(非多线程).RP

定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除. 从定义上我们可以看到两个函数十分类似,只不过前者执行一次,而后者可以执行多次,两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒数. 很简单的定义,使用起来也很简单,但有时候我们的代码并不是按照我们

【转】解决存储过程执行快,但C#程序调用执行慢的问题

这两天遇到一个问题令人比较郁闷,一个大概120行左右的存储过程在SQL Server2012的查询分析器里面执行,速度非常理想,1秒不到,即可筛选抓取到大概500条数据记录.但在C#程序代码里调用,就提示连接超时.把CommandTimeout设置为300,就要3分钟左右时间才能显示出来,检查了几遍代码也没有发现错误.问题依旧. 原因分析:1.由于在查询分析器里执行速度很快,并且数据量也不多.2.只在程序里调用才有缓慢的情况.3.设置CommandTimeout参数,就可以显示结果出来,但要很久

java调用执行cmd命令

未经允许,禁止转载!!! package practice; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class cmdadb { public void executeCMDconsole(String cmd) { //此方法为打印日志到