想让这个批量执行工具支持除 .py 之外的更多脚本/可执行文件(比如 .bat、.sh、.cmd 等),核心需要修改文件筛选规则和不同文件的执行逻辑(因为不同类型的文件执行方式不一样,比如 .sh 不能用 Python 解释器执行)。
下面我会改造这个工具,让它支持多种常见脚本类型,并实现自动匹配对应执行方式,同时保留良好的使用体验。


.sh,Linux/macOS 不支持 .bat,给出友好提示)import tkinter as tkfrom tkinter import filedialog, scrolledtext, messageboximport subprocessimport osimport sysclassBatchScriptExecutor:def__init__(self, root):# 初始化主窗口 self.root = root self.root.title("多类型脚本批量执行工具 - 效率提升版") self.root.geometry("800x600") # 窗口大小:宽800,高600# 存储选中的脚本文件路径 self.selected_scripts = []# 【新增】定义支持的脚本类型(后缀: 执行说明/备注)# 跨平台兼容说明:.bat/.cmd 仅Windows支持,.sh 仅Linux/macOS支持 self.supported_file_types = {".py": "Python 脚本(跨平台)",".bat": "Windows 批处理脚本",".cmd": "Windows 命令行脚本",".sh": "Linux/macOS Shell 脚本",".ps1": "PowerShell 脚本(跨平台,需PowerShell环境)" }# 【新增】获取支持的文件后缀列表,用于文件筛选 self.supported_suffixes = list(self.supported_file_types.keys())# 搭建GUI界面 self._build_ui()def_build_ui(self):"""构建可视化界面"""# 第一排:选择脚本文件按钮 self.select_btn = tk.Button( self.root, text="📂 选择脚本文件(可多选,支持多类型)", command=self.select_scripts, font=("微软雅黑", 10), bg="#4CAF50", fg="white" ) self.select_btn.pack(pady=10, fill=tk.X, padx=20)# 【新增】支持的文件类型提示 tip_text = f"支持的文件类型:{', '.join([f'{suffix}({desc})'for suffix, desc in self.supported_file_types.items()])}" tk.Label(self.root, text=tip_text, font=("微软雅黑", 8), fg="#666666").pack(anchor=tk.W, padx=20)# 第二排:显示选中的脚本列表(带滚动条) tk.Label(self.root, text="✅ 已选中的脚本列表", font=("微软雅黑", 10, "bold")).pack(anchor=tk.W, padx=20) self.script_list_box = scrolledtext.ScrolledText( self.root, height=10, font=("Consolas", 9), state=tk.DISABLED # 初始不可编辑,仅用于显示 ) self.script_list_box.pack(pady=5, fill=tk.X, padx=20)# 第三排:执行/清空按钮 self.btn_frame = tk.Frame(self.root) self.btn_frame.pack(pady=10, fill=tk.X, padx=20) self.run_btn = tk.Button( self.btn_frame, text="▶️ 一键批量执行", command=self.run_batch_scripts, font=("微软雅黑", 10), bg="#2196F3", fg="white" ) self.run_btn.pack(side=tk.LEFT, padx=10) self.clear_btn = tk.Button( self.btn_frame, text="🗑 清空所有内容", command=self.clear_all, font=("微软雅黑", 10), bg="#f44336", fg="white" ) self.clear_btn.pack(side=tk.LEFT, padx=10)# 第四排:执行日志显示区域 tk.Label(self.root, text="📝 执行日志(实时更新)", font=("微软雅黑", 10, "bold")).pack(anchor=tk.W, padx=20) self.log_text = scrolledtext.ScrolledText( self.root, height=15, font=("Consolas", 9), state=tk.DISABLED ) self.log_text.pack(pady=5, fill=tk.BOTH, padx=20, expand=True)defselect_scripts(self):"""选择多个支持类型的脚本文件"""# 【改造】构建文件筛选器,支持所有定义的脚本类型 file_filters = []# 先添加「所有支持的脚本文件」选项 all_supported = ("All Supported Scripts", f"*{';*'.join(self.supported_suffixes)}") file_filters.append(all_supported)# 再添加单个类型的筛选选项for suffix, desc in self.supported_file_types.items(): file_filters.append((desc, f"*{suffix}"))# 最后添加「所有文件」选项 file_filters.append(("All Files", "*.*"))# 弹出文件选择对话框,支持多选 files = filedialog.askopenfilenames( title="选择支持的脚本文件", filetypes=file_filters, initialdir=os.getcwd() # 初始目录为当前工作目录 )if files:# 过滤:仅保留支持后缀的文件(防止用户通过「所有文件」选择不支持的类型) valid_files = []for file in files: file_suffix = os.path.splitext(file)[1].lower()if file_suffix in self.supported_suffixes: valid_files.append(file)else: self._append_log(f"【忽略】不支持的文件类型:{os.path.basename(file)}(后缀:{file_suffix})\n")# 更新选中的脚本列表(仅保留有效文件) self.selected_scripts = valid_files# 显示选中的文件到列表框 self._update_script_list()# 日志区域提示选择成功 self._append_log(f"【提示】成功选择 {len(self.selected_scripts)} 个有效脚本文件\n")def_update_script_list(self):"""更新脚本列表显示"""# 先启用列表框,编辑完成后禁用 self.script_list_box.config(state=tk.NORMAL) self.script_list_box.delete(1.0, tk.END) # 清空原有内容for idx, script in enumerate(self.selected_scripts, 1): file_suffix = os.path.splitext(script)[1].lower() file_desc = self.supported_file_types.get(file_suffix, "未知类型")# 显示:序号 + 文件名(完整路径) + 类型说明 self.script_list_box.insert(tk.END, f"{idx}. {os.path.abspath(script)} 【{file_desc}】\n") self.script_list_box.config(state=tk.DISABLED)def_get_exec_command(self, script_path):"""【核心改造】根据文件类型,返回对应的执行命令列表""" file_suffix = os.path.splitext(script_path)[1].lower() current_platform = sys.platform # 获取当前系统平台:win32 (Windows)、linux (Linux)、darwin (macOS)# 针对不同文件类型,构建执行命令if file_suffix == ".py":# Python 脚本:使用当前Python解释器执行return [sys.executable, script_path]elif file_suffix in [".bat", ".cmd"]:# Windows 批处理脚本:仅支持Windows平台if current_platform != "win32":raise Exception(f"当前系统({current_platform})不支持执行 .bat/.cmd 脚本")return ["cmd.exe", "/c", script_path]elif file_suffix == ".sh":# Shell 脚本:仅支持 Linux/macOS 平台if current_platform in ["linux", "darwin"]:# 先确保脚本有可执行权限(Linux/macOS) os.chmod(script_path, 0o755)return ["/bin/bash", script_path]else:raise Exception(f"当前系统({current_platform})不支持执行 .sh 脚本(需Linux/macOS环境)")elif file_suffix == ".ps1":# PowerShell 脚本:跨平台(需安装PowerShell)if current_platform == "win32":# Windows 下直接调用 powershellreturn ["powershell.exe", "-ExecutionPolicy", "Bypass", "-File", script_path]else:# Linux/macOS 下调用 pwsh(需提前安装PowerShell)return ["pwsh", "-ExecutionPolicy", "Bypass", "-File", script_path]else:raise Exception(f"不支持的文件类型:{file_suffix}")defrun_batch_scripts(self):"""批量执行选中的脚本(支持多类型)"""ifnot self.selected_scripts: messagebox.showwarning("警告", "请先选择至少一个有效脚本文件!")return# 日志区域提示开始执行 self._append_log("="*50 + "\n") self._append_log("【开始执行】批量脚本执行任务启动...\n") self._append_log(f"【系统信息】当前平台:{sys.platform}(win32=Windows,linux=Linux,darwin=macOS)\n") self._append_log("="*50 + "\n")# 遍历每个选中的脚本,逐个执行for idx, script_path in enumerate(self.selected_scripts, 1): script_name = os.path.basename(script_path) file_suffix = os.path.splitext(script_path)[1].lower() self._append_log(f"\n【正在执行】第 {idx} 个脚本:{script_name} 【{self.supported_file_types.get(file_suffix, '未知类型')}】\n")try:# 【核心改造】获取对应文件类型的执行命令 exec_command = self._get_exec_command(script_path)# 调用subprocess执行脚本,捕获输出和错误信息 result = subprocess.run( exec_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=300# 超时时间:5分钟(可根据脚本耗时调整) )# 处理执行结果if result.returncode == 0:# 执行成功 self._append_log(f"【执行成功】{script_name} 运行完成!\n")if result.stdout: self._append_log(f"【脚本输出】\n{result.stdout}\n")else:# 执行失败(返回码非0) self._append_log(f"【执行失败】{script_name} 运行出错!\n")if result.stderr: self._append_log(f"【错误信息】\n{result.stderr}\n")except subprocess.TimeoutExpired: self._append_log(f"【执行超时】{script_name} 运行超过5分钟,已终止!\n")except Exception as e: self._append_log(f"【执行异常】{script_name}:{str(e)}\n")# 执行完成提示 self._append_log("\n" + "="*50 + "\n") self._append_log("【执行结束】批量脚本任务全部处理完毕!\n") self._append_log("="*50 + "\n") messagebox.showinfo("完成", "批量脚本执行任务已全部结束!请查看日志详情。")def_append_log(self, content):"""向日志区域追加内容(实时更新)"""# 先启用日志框,追加内容后禁用,防止用户手动编辑 self.log_text.config(state=tk.NORMAL) self.log_text.insert(tk.END, content) self.log_text.see(tk.END) # 自动滚动到末尾,显示最新日志 self.log_text.config(state=tk.DISABLED)# 强制刷新界面,确保日志实时显示 self.root.update_idletasks()defclear_all(self):"""清空选中的脚本列表和日志内容"""# 清空脚本列表 self.selected_scripts = [] self.script_list_box.config(state=tk.NORMAL) self.script_list_box.delete(1.0, tk.END) self.script_list_box.config(state=tk.DISABLED)# 清空日志 self.log_text.config(state=tk.NORMAL) self.log_text.delete(1.0, tk.END) self.log_text.config(state=tk.DISABLED) messagebox.showinfo("提示", "已成功清空所有内容!")if __name__ == "__main__":# 启动GUI程序 root = tk.Tk() app = BatchScriptExecutor(root) root.mainloop()supported_file_types 字典,存储「文件后缀-类型说明」,方便扩展和显示.py、.bat、.cmd、.sh、.ps1 五种常见脚本,后续可直接在字典中添加新类型_get_exec_command() 方法,专门处理「文件类型→执行命令」的映射.py:沿用 sys.executable,保证环境一致性.bat/.cmd:Windows 下调用 cmd.exe /c 执行.sh:Linux/macOS 下调用 /bin/bash 执行,且自动添加可执行权限.ps1:调用 PowerShell 执行,兼容跨平台(需提前安装 PowerShell).py、.bat、.cmd、.ps1(自带 PowerShell).py、.sh,.ps1 需手动安装 PowerShell.sh 脚本尽量在开头添加 #!/bin/bash 声明.ps1 脚本若出现权限问题,需调整系统执行策略如果需要支持其他脚本(比如 .js、.php),只需两步:
supported_file_types 字典中添加新条目,例如:self.supported_file_types = {# 原有类型...".js": "Node.js 脚本(需安装Node.js)",".php": "PHP 脚本(需安装PHP环境)"}_get_exec_command() 方法中添加对应的执行命令逻辑,例如:elif file_suffix == ".js":# 调用 node 执行 .js 脚本return ["node", script_path]elif file_suffix == ".php":# 调用 php 执行 .php 脚本return ["php", script_path]