zoukankan      html  css  js  c++  java
  • (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:windowssystem32cmd.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);
  • 相关阅读:
    14-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,8266程序编写
    Zookeeper之Curator(1)客户端基本的创建,删除,更新,查找操作api
    【1】基于quartz框架和Zookeeper实现集群化定时任务系统
    Spring源码学习之:ClassLoader学习(5)-自测
    java多线程:线程体往外抛出异常的处理机制实践
    MySQL详解--锁,事务
    ubuntu下访问支付宝官网,安装安全控件
    spring源码学习之:springAOP实现底层原理
    spring源码学习之:项目公共配置项解决方案
    java多线程:synchronized和lock比较浅析
  • 原文地址:https://www.cnblogs.com/fdyang/p/3701527.html
Copyright © 2011-2022 走看看