C#调用Bat的方法。


            Process ps = new Process();
            ps.StartInfo.UseShellExecute = true;
            ps.StartInfo.FileName = FSPath + "Open_Fs_Cli.bat";
            ps.StartInfo.WorkingDirectory = FSPath;
            ps.StartInfo.CreateNoWindow = true;
            ps.Start();

 

ps.StartInfo.WorkingDirectory = FSPath;  这一句最为重要,否则运行后要么闪退,要么卡死,要么运行不了。

 

 

<think>我们参考了站内引用中的多个代码片段,并结合用户需求(使用C#调用批处理文件)进行整合和优化。 主要步骤: 1. 创建Process对象。 2. 设置Process的StartInfo属性,包括文件名(bat文件路径)、工作目录(通常为bat文件所在目录)、是否创建窗口等。 3. 启动进程并等待其退出(可选)。 注意点: - 如果需要隐藏命令行窗口,设置CreateNoWindow为true,WindowStyle为Hidden。 - 如果需要等待批处理执行完毕再继续,使用WaitForExit方法。 - 如果需要捕获输出,设置RedirectStandardOutput为true,然后读取输出流。 我们将提供两种常见调用方式: 方式1:同步执行(等待执行完成) 方式2:异步执行(不等待) 同时,我们也会考虑错误处理。 根据引用[1][2][3][4]的示例,我们整合如下:</think>### C# 调用批处理文件(.bat)的完整指南 #### 基本调用方法 ```csharp using System.Diagnostics; public class BatExecutor { // 同步执行BAT文件(等待执行完成) public static void ExecuteBatSync(string batPath) { try { using (Process process = new Process()) { process.StartInfo = new ProcessStartInfo { FileName = batPath, WorkingDirectory = Path.GetDirectoryName(batPath), // 设置工作目录[^1][^3] UseShellExecute = false, // 不使用系统shell执行 CreateNoWindow = true, // 不创建新窗口 WindowStyle = ProcessWindowStyle.Hidden // 隐藏窗口 }; process.Start(); process.WaitForExit(); // 等待执行完成 Console.WriteLine($"BAT执行完成,退出代码: {process.ExitCode}"); } } catch (Exception ex) { Console.WriteLine($"执行失败: {ex.Message}"); } } } ``` #### 异步执行方法(不阻塞主线程) ```csharp // 异步执行BAT文件(立即返回) public static void ExecuteBatAsync(string batPath) { try { using (Process process = new Process()) { process.StartInfo = new ProcessStartInfo { FileName = batPath, WorkingDirectory = Path.GetDirectoryName(batPath), UseShellExecute = true, // 使用系统shell执行 CreateNoWindow = false, // 显示窗口 WindowStyle = ProcessWindowStyle.Normal }; process.Start(); // 立即返回 Console.WriteLine("BAT已在后台执行"); } } catch (Exception ex) { Console.WriteLine($"启动失败: {ex.Message}"); } } ``` #### 带参数执行BAT文件 ```csharp // 执行带参数的BAT文件 public static void ExecuteBatWithArgs(string batPath, string arguments) { using (Process process = new Process()) { process.StartInfo = new ProcessStartInfo { FileName = batPath, Arguments = arguments, // 传递参数 WorkingDirectory = Path.GetDirectoryName(batPath), UseShellExecute = true }; process.Start(); } } // 使用示例 ExecuteBatWithArgs(@"C:\Scripts\backup.bat", "\"D:\\Projects\" 2024-05"); ``` #### 捕获输出结果 ```csharp // 捕获BAT执行输出 public static string ExecuteAndGetOutput(string batPath) { try { using (Process process = new Process()) { process.StartInfo = new ProcessStartInfo { FileName = batPath, WorkingDirectory = Path.GetDirectoryName(batPath), UseShellExecute = false, RedirectStandardOutput = true, // 重定向输出 RedirectStandardError = true, // 重定向错误 CreateNoWindow = true }; process.Start(); string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); return string.IsNullOrEmpty(error) ? output : $"输出:\n{output}\n错误:\n{error}"; } } catch (Exception ex) { return $"执行异常: {ex.Message}"; } } ``` #### 使用示例 ```csharp // 同步执行 BatExecutor.ExecuteBatSync(@"D:\scripts\system_check.bat"); // 异步执行 BatExecutor.ExecuteBatAsync(@"C:\utils\cleanup.bat"); // 带参数执行 BatExecutor.ExecuteBatWithArgs(@"E:\backups\daily.bat", "full C:\\Data"); // 获取输出 string result = BatExecutor.ExecuteAndGetOutput(@"F:\reports\generate_report.bat"); Console.WriteLine(result); ``` #### 关键参数说明 | 参数 | 说明 | 典型值 | |------|------|--------| | `WorkingDirectory` | 工作目录 | `Path.GetDirectoryName(batPath)` | | `UseShellExecute` | 使用系统shell | `true`(显示窗口)/`false`(隐藏) | | `CreateNoWindow` | 是否创建窗口 | `true`(不创建)/`false`(创建) | | `RedirectStandardOutput` | 重定向输出流 | `true`(捕获输出) | | `Arguments` | 传递给BAT的参数 | 字符串格式参数 | #### 最佳实践 1. **权限处理**: ```csharp // 以管理员身份运行 process.StartInfo.Verb = "runas"; ``` 2. **超时控制**: ```csharp if (!process.WaitForExit(30000)) // 30秒超时 { process.Kill(); Console.WriteLine("执行超时"); } ``` 3. **实时输出处理**: ```csharp process.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine($"[实时] {e.Data}"); }; process.BeginOutputReadLine(); ``` 4. **错误处理增强**: ```csharp try { process.Start(); } catch (Win32Exception ex) when (ex.NativeErrorCode == 1223) { Console.WriteLine("用户取消了权限请求"); } catch (FileNotFoundException) { Console.WriteLine("BAT文件不存在"); } ``` #### 典型应用场景 1. **自动化部署**: ```csharp ExecuteBatSync(@"\\server\deploy\setup.bat"); ``` 2. **定期维护**: ```csharp Task.Run(() => ExecuteBatSync(@"C:\cleanup.bat")); ``` 3. **数据处理流水线**: ```csharp string report = ExecuteAndGetOutput(@"D:\reports\generate_monthly.bat"); File.WriteAllText(@"E:\output\report.txt", report); ``` > **注意**:当`UseShellExecute=false`时,不能同时设置`Verb="runas"`,需通过清单文件提升权限[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值