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);
  • 相关阅读:
    C# ConfigMan.cs
    C# 反序列化JSON
    C#求数组最大值或最大值位置索引
    C#获取DataGridView数据源DataSource类型
    C#动态添加DataGridView列和行
    C# WinForm 检测文件是否被占用
    C#开源组件NPOI处理Excel导入DataTable数据至Sheet
    C# WinForm 扩展指定列宽适应DataGridView显示行数(二)
    C# WinForm 扩展指定列宽适应DataGridView显示行数
    VFP9 对 SqlServer Image字段的图片存取处理
  • 原文地址:https://www.cnblogs.com/fdyang/p/3701527.html
Copyright © 2011-2022 走看看