ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

企业软件批量安装全攻略:从GPO、SCCM到Python离线部署

企业软件批量安装全攻略:从GPO、SCCM到Python离线部署 每次一到“公司要统一装软件”这种需求很多运维同学的第一反应就是拿起一个安装包跑到一台机器前开始点“下一步”点完这台点下一台。运气好几十台还能扛运气不好碰到几百台机器、还要限制在几分钟内完成那就只能干瞪眼。这些年我经历过不少批量部署场景从几十台的小办公室到上千节点的生产环境都碰过这篇文章就把我对“企业软件批量安装”的理解、实操方法和踩过的坑一次性说清楚。文章会覆盖几个层面的内容先聊批量安装的核心思路与方案选型再盘点企业级平台工具GPO、SCCM/Intune、第三方部署工具重点拆解脚本批量安装的静默参数、日志与退出码处理最后单独讲一个非常贴近大家痛点、又很容易被忽略的场景——用 Python 批量安装本地 whl 文件做离线包分发。无论你是刚接手公司电脑维护的兼职网管还是专职系统管理员应该都能找到能直接拿走用的内容。1. 先搞清楚需求再选方案批量安装这件事本质是解一道组合题1.1 为什么不能靠人工一台台装批量安装的核心原因我总结成四个字交付一致性。十几台机器手工装看起来还能忍一旦到了上百台、上千台所有问题都会被放大——装错版本、漏装组件、配置差异、时间成本不可控。最让 IT 头疼的还不是装的过程而是后续排查A 机器装了 7-Zip 21.02B 机器装的是 21.00某个软件恰好依赖 21.02 的接口这就成了“薛定谔的环境”不到运行那一刻永远不知道行不行。人工一台台装还会产生一个隐性成本重复劳动中的注意力疲劳。我见过不少运维同学装到第 30 台机器时已经不想看下一步弹窗了顺手点“下一步”点错结果装了插件或者改了默认路径。这在批量部署场景里几乎是致命的。脚本化、平台化的批量安装之所以必要本质上就是把这些“手工点击”的动作标准化让成百上千台机器执行完全一样的安装逻辑最终得到可以预期的结果。1.2 批量安装的四种主流路径和选型逻辑结合我经手的项目现在企业里批量装软件主流路子大概有四条。第一条域环境下的组策略GPO软件部署。适合中等规模、以 Windows 为主的企业把 MSI 格式的安装包发布到域中客户端登录时自动安装。优点是“省心”配一次策略就能长期生效缺点是只能处理 MSI 包对 EXE 为主的现代软件支持很差。第二条专业部署平台比如 Microsoft Intune、System Center Configuration ManagerSCCM这类。它们能覆盖系统镜像、软件安装、补丁更新、配置基线等一整套生命周期管理适合几百人以上的规模。缺点是成本高、实施周期长不是所有团队都有精力把整套体系跑起来。第三条脚本批量执行。用 PowerShell 或批处理脚本把安装包放到共享目录然后通过计划任务、远程执行工具或者简单的启动脚本触发安装。这是最灵活、最“轻”的方式也是小团队和临时批量交付中最常用的。第四条第三方轻量部署工具比如 PDQ Deploy、Action1 这类。它们把“扫描客户端、推送安装包、执行安装、获取结果”这个流程做成了图形界面比脚本更直观比 SCCM 轻量得多适合中型规模的标准化软件分发。你可能会发现这四条路并不是非此即彼的关系更多是互补。选型时我的建议是先回答三个问题环境规模有多少台机器安装包格式主要是 MSI 还是 EXE或者两者都有日常有没有专职 IT 运维人员这三个答案基本就能把方案锁死。规模越大、流程越标准越值得上平台规模小或者一次性交付的应用脚本反而更高效。1.3 先把授权和合规这件事解决掉批量安装有一个很容易被忽视的前置条件软件授权。很多软件的单机授权和批量授权是分开的你拿到一个安装包不代表你可以把它推到全公司。企业级软件通常要走正版授权或批量许可通道尤其是一些商业软件授权方式可能按用户数、按设备数或按核心数计算。部署前先确认清楚手里的授权覆盖范围否则批量安装就是在给公司埋雷。我这里更想强调的其实是操作层面的“合规”问题统一软件版本、统一安装参数保证所有客户端都能被纳入后续的补丁管理和卸载管理。如果安装时改了默认目录或者跳过了组件后续卸载和更新会变得非常痛苦。所以批量安装在执行层面目标应该尽量“标准化、可追溯”——安装包放哪、参数是什么、日志记在哪都要在部署前定好规则。2. 企业级平台方案盘点GPO、SCCM/Intune 和第三方部署工具怎么选2.1 组策略GPO域环境下最简单的方式组策略是 Windows 域环境最传统也最容易上手的批量部署方式它适合“企业内部的软件安装包以 MSI 为主”的场景。原理不复杂把安装包放到一个所有域计算机都能访问的网络共享目录然后在组策略管理编辑器里新建一条“软件安装”策略指向这个共享里的 MSI 文件。客户端机器在下一次组策略刷新时默认 90 到 120 分钟开机时也会触发就会自动完成安装或卸载。这个方案最大的优点就是免费、原生、无需额外部署任何服务端组件。如果公司已经有 Active Directory几分钟就能配好。但它有两个明显短板第一只支持 MSI 包而现在绝大多数商业软件默认给的是 EXE 安装包你得额外把 EXE 转成 MSI 或者封装成 MST 转换文件操作门槛并不低第二组策略软件安装针对“新装”比较友好对后续的卸载、升级、冲突处理基本无能为力。所以我的经验是GPO 适合做“基础装机软件”的兜底比如 PDF 阅读器、压缩工具、统一输入法这类相对固定的基础软件不适合做频繁更新的业务软件管理。2.2 SCCM/Intune大型组织的“正规军”方案如果组织规模大、软件种类多、有专职的系统管理员团队那 SCCM 或者 Intune 这类平台基本是绕不开的选项。SCCM 的历史很长功能极其丰富部署软件只是它的一小块能力实际使用中它更多是负责整个 Windows 环境的“全生命周期管理”系统镜像部署、补丁管理、软件分发、资产管理、远程控制都能做。Intune 则是微软面向现代管理方向的方案更适合设备归云管、或者大量使用移动设备的场景也是现在很多企业做终端统一管理的一块拼图。用这类平台做批量安装流程一般是这样管理员先把安装包和安装脚本上传到平台配置“应用程序模型”包括检测规则比如检查对应 EXE 文件是否存在、注册表项是否存在、版本号是否符合预期然后把应用程序部署到目标设备集合。客户端收到任务后会根据检测规则决定是安装、修复还是卸载。这里最值得学习的就是“检测规则”这个设计平台不是机械地执行安装而是先判断目标机器当前状态再决策能有效避免同一台机器反复装、装错版本之类的问题。当然代价就是学习成本和组织成本都不低。SCCM 需要完整的服务器基础设施Intune 则要求设备先完成注册并配合使用。对大多数中小企业来说这套方案可能偏重没必要为了装个办公软件就把全家桶都上齐。2.3 第三方部署工具对标中小团队的轻量型选择PDQ Deploy 这类第三方工具是“介于 GPO 和 SCCM 之间”的一种甜点式选择。它的核心工作方式很简单管理员在控制台上创建一个部署包指定安装参数、目标计算机列表或集合工具会通过网络推送到目标机器并在本地静默安装同时把安装结果成功/失败/需重启回传给控制台。第三方工具的优势很明显对 EXE/MSI/脚本都有良好的支持操作界面比 SCCM 友好很多部署速度也快基本能在几十分钟内让一个中小规模网络的所有机器装上指定软件。而且它们通常会内置很多常见软件的“预置部署包”比如 PDF 阅读器、7-Zip、视频会议客户端等下载后改一下参数就能用对时间紧张的运维来说非常省事。缺点也不回避这类工具普遍按客户端节点数收费规模一大成本就起来了另外它们对网络环境有要求如果目标机器不在同一个可访问的网段或者有较强的防火墙策略推送可能失败。另外它的能力边界基本就在“软件分发”这一个点上别指望它替代 SCCM 做补丁或者系统镜像管理。3. 脚本批量安装实战PowerShell 与批处理的核心技巧3.1 为什么要用脚本而不是只靠工具平台工具当然省心但现实世界里总会遇到“工具够不着”的场景跨网段临时部署、给不在域的机器装离线包、客户环境不允许装第三方代理、新老系统混杂……这时候脚本反而成了最通用的瑞士军刀。我自己经常做的就是把软件安装包统一扔到一个共享目录写一个 PowerShell 脚本接收“软件名版本号”参数然后通过远程执行或计划任务分发。这样的好处是整套逻辑全部掌握在自己手里出了问题可以直接打开脚本看不会被平台的黑盒逻辑限制住。脚本方案的弹性还体现在“即插即用”。今天要装 5 个软件明天加 2 个改一下配置列表就行。最重要的是脚本可以精确控制安装顺序——有些软件必须依赖另一些先装好工具平台虽然也能配依赖关系但在临时场景里脚本永远是响应最快的。3.2 静默安装与无人值守安装读懂安装器的“暗号”脚本批量安装的基础是“静默安装”——安装过程不弹窗、不等待用户点击把安装包后台跑完。不同安装器框架的静默参数差别很大这里有一个“看安装包就知道用什么参数”的实用经验安装器框架常见后缀静默参数备注MSI.msimsiexec /i 包名.msi /qn /norestart/qn表示无界面/norestart表示不自动重启NSIS.exe安装包.exe /S大小写敏感必须是大写/SInno Setup.exe安装包.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART三个参数可以组合使用InstallShield.exe安装包.exe /s /v/qn/v后面引号里是传给 MSI 引擎的参数自带安装程序的.exe视软件文档而定部分商业软件用独立安装器需要查官方文档那具体怎么判断一个安装包是什么框架最笨也最靠谱的办法直接右键安装包看“文件属性-版本-产品名称”能看到类似“Nullsoft Installer”“Inno Setup”之类的描述或者用 7-Zip 打开安装包看看里面有没有[NSIS].nsi、Inno Setup等特征文件。如果实在判断不出来可以在一台测试机上双击安装包观察安装目录结构和快捷方式特征通常能反推出来。静默参数里的坑我踩得最深的一个是大小写。NSIS 的静默参数/S必须是大写小写/s在很多版本里会被忽略然后安装包就在目标机器上弹出一个图形界面把“无人值守批量安装”直接打成“半自动安装”。另一个容易忽视的细节是“安装完成后重启”MSI 的/norestart和 Inno 的/NORESTART都要显式加上避免安装完把全公司的机器都重启一遍。3.3 一次性搞定多软件部署的脚本写法我分享一个自己常用的 PowerShell 脚本思路它做的事非常简单从配置清单里读取软件包名和安装参数循环调用安装器并把结果写入日志。# install-apps.ps1 # 用法: .\install-apps.ps1 -SoftwareList (7zip,chrome,reader) param( [string[]]$SoftwareList ) $ErrorActionPreference Continue $sharePath \\192.168.10.20\software $logPath C:\ITLogs\appinstall.log function Write-Log { param([string]$Message) $now Get-Date -Format yyyy-MM-dd HH:mm:ss Add-Content -Path $logPath -Value $now $Message } foreach ($app in $SoftwareList) { Write-Log 开始安装: $app switch ($app) { 7zip { $pkg Get-ChildItem -Path $sharePath -Filter 7z*.exe | Select-Object -First 1 $args /S $proc Start-Process -FilePath $pkg.FullName -ArgumentList $args -Wait -PassThru } chrome { $pkg Get-ChildItem -Path $sharePath -Filter ChromeSetup*.exe | Select-Object -First 1 $args /silent /install $proc Start-Process -FilePath $pkg.FullName -ArgumentList $args -Wait -PassThru } default { Write-Log 未知软件: $app跳过 continue } } if ($proc.ExitCode -eq 0) { Write-Log $app 安装成功 } else { Write-Log $app 安装失败退出码: $proc.ExitCode } }这个脚本里的几个关键点我逐个说明一下。Start-Process -Wait这一步非常关键必须等安装进程真正退出脚本才能接着装下一个软件否则多个安装程序同时运行容易互相锁文件。-PassThru则是把进程对象传回来方便我们读退出码。退出码是判断安装是否成功的唯一靠谱依据千万别靠“睡 10 秒”来猜。还有一个小技巧安装包文件名里通常带版本号用Get-ChildItem -Filter 7z*.exe这种模糊匹配可以保证脚本不会因为版本升级而失效。上线前先把脚本里的共享路径和软件名替换成自己的实际值然后找两三台测试机跑一遍确认日志里的退出码全部为 0再放开到生产环境。3.4 日志、退出码与排错信息批量安装过程中日志比什么都重要。我见过不少运维同学脚本里装完软件就结束了等出了问题只能一台台远程桌面去看效率极低。规范的做法是每个软件安装之后都要记录三样东西装的是哪个包包含完整路径和版本号、退出码是多少、目标机器的 hostname 和时间戳。退出码的含义不是统一的。0 通常表示成功但有些安装器也会用 0 表示“已经装过了”或者“用户取消了”。3010 这个退出码在 MSI 场景里要特别注意它表示“安装成功但需要重启”。第三方软件还会用 1638 表示“另一个版本已安装”1642 表示“升级无法完成”。所以收集到退出码之后不能只看 0还要建立一张“退出码对照表”结合软件类型去判断真实结果。另外很多商业软件的安装器支持自己记录日志比如 MSI 可以用/l*v C:\log\msi.log打开详细日志Adobe 的安装器通常也带日志选项。给安装命令统一加上“生成日志”的参数是排查问题上最划算的投资——因为有时脚本的退出码是 0但软件其实没装成功这时候只有详细的安装器日志才能告诉你真相。4. 2026 年很值得掌握的一种姿势用 Python 批量安装本地 WHL 文件4.1 为什么需要“本地 WHL 批量安装”这种需求前面聊的都是“装到操作系统层面”的软件部署但在企业里还有一大批“装到 Python 环境里”的软件包——准确说是 Python 的第三方库。很多内部工具、数据分析平台、自动化脚本都需要预先准备好一批 Python 库。正常联网情况下一句pip install -r requirements.txt就搞定了但到了企业生产环境事情往往没那么顺利。最典型的场景有三个。第一生产服务器是隔离网络无法访问公网软件库管理员只能先从能上网的机器把 whl 文件下载好再通过移动介质或者内网共享传进去安装。第二要保证多台机器、多个环境安装的版本完全一致。如果每台机器都从公网拉最新版容易出现“今天装的是 2.1.0明天别人装成 2.2.0”的版本漂移这在 IT 把“一致性”看得比“新版本”更重的环境里是不能接受的。第三审计要求安装包从哪来、是什么版本需要有记录可追溯。本地 whl 文件天然满足这一点因为你手里存的就是安装源本身。这里的 whl 文件就是 Python 的 Wheel 格式安装包本质上是一个 zip 压缩包但包含了安装这个库所需的所有文件、元数据和依赖信息。pip install在处理 whl 文件时不需要编译源码安装速度比源码包tar.gz快得多所以也是当前 Python 分发的主流格式。4.2 本地 WHL 批量安装的完整操作流程结合上面的需求我把“本地 whl 批量安装”的完整流程拆成四个步骤。第一步确定依赖清单并下载 whl 文件。在一台能上公网、且 Python 版本与目标机器尽可能一致的机器上先准备一个requirements.txt然后执行pip download -r requirements.txt -d D:\wheels --only-binary:all: --platform win_amd64 --python-version 312这里的几个参数需要解释一下-d指定下载目录--only-binary:all:是强制只下载 whl 二进制包不下载源码包--platform win_amd64和--python-version 312是为了锁定目标平台和 Python 版本。如果你的目标机器是 Python 3.11 且 64 位这个参数就要改成--python-version 311 --platform win_amd64。总之参数要和实际环境严格对应否则下载下来的包根本装不上。第二步把 whl 文件分发到目标机器的本地目录。可以用共享文件夹、移动硬盘也可以用脚本批量复制。这个环节最重要的是“目录固定”比如统一放在C:\wheels\下并把目录设置为只读或者至少不做清理避免后续重复安装时发现包不见了。第三步在目标机器上批量执行安装。最简单的做法是在命令行里直接装python -m pip install --no-index --find-linksD:\wheels -r requirements.txt--no-index表示禁止 pip 去公网仓库查询--find-links告诉 pip 到本地目录寻找可用的 whl。这样 pip 会老老实实在本地目录里找依赖找不到就报错绝不会偷偷联网。这个“离线安装”的组合拳就是让本地 whl 批量安装成立的核心。第四步验证安装结果。装完之后不要直接跑业务先执行一段检查把关键库的版本号打印出来python -c import requests, pandas, openpyxl; print(requests.__version__, pandas.__version__, openpyxl.__version__)如果版本号和预期一致说明环境没问题。如果某一台机器版本不对就该重点检查那台机器是不是有多个 Python 环境、pip 是否指向了错误解释器。4.3 带依赖检查和自定义配置的安装脚本如果只是三五台机器手动执行上面的命令完全没问题。但到了几十台机器还是一次性配置写个脚本循环更靠谱。我提供一个 Python 脚本模板它会遍历一个目录里的所有 whl 文件逐个安装并把结果记录下来。# batch_install_wheels.py import os import subprocess import sys import datetime WHEEL_DIR rC:\wheels LOG_FILE rC:\wheels\install.log def log(msg): ts datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) with open(LOG_FILE, a, encodingutf-8) as f: f.write(f[{ts}] {msg}\n) print(f[{ts}] {msg}) def main(): if not os.path.isdir(WHEEL_DIR): log(f错误: 目录不存在 {WHEEL_DIR}) sys.exit(1) wheels [f for f in os.listdir(WHEEL_DIR) if f.endswith(.whl)] if not wheels: log(错误: 未找到任何 .whl 文件) sys.exit(1) log(f共发现 {len(wheels)} 个 whl 文件开始安装...) failed [] for w in wheels: whl_path os.path.join(WHEEL_DIR, w) log(f正在安装: {w}) result subprocess.run( [sys.executable, -m, pip, install, --no-index, --find-links, WHEEL_DIR, whl_path], capture_outputTrue, textTrue, encodingutf-8, errorsreplace ) if result.returncode 0: log(f成功: {w}) else: failed.append(w) log(f失败: {w}, returncode{result.returncode}) log(result.stdout[-2000:]) log(result.stderr[-2000:]) if failed: log(以下 whl 安装失败: , .join(failed)) sys.exit(2) else: log(全部安装完成无失败项) if __name__ __main__: main()这个脚本的思路很简单但有几个细节值得说明。sys.executable可以保证调用的 pip 和当前正在运行的 Python 是同一个解释器避免“用别的 Python 的 pip 装到别的环境”这种经典乌龙。capture_outputTrue把安装过程的输出抓下来一旦失败可以直接看日志errorsreplace是防止某些安装包输出非 UTF-8 内容导致日志写入报错。实际使用中很多运维会把这段脚本包装成一个远程调用或者计划任务。比如放在共享目录通过远程执行工具或者计划任务在每台机器上执行一次。如果你不想写额外代码也可以先把 whl 文件推送到目标机器然后用一句python batch_install_wheels.py触发安装结果自动写到日志里。不过要记住脚本只是把“本地目录里的 whl 装好”它不会自动解决“依赖缺失”的问题。如果某个 whl 的依赖不在本地目录里pip 会当场报错。所以下载阶段务必把所有依赖包括依赖的依赖都拉齐用pip download的-r参数就能做到因为pip download会递归解析并下载依赖。4.4 WHL 安装为什么失败常见的三类原因本地 whl 安装失败最常见的原因就是“平台或 Python 版本不匹配”。whl 文件名里有平台信息和 Python 版本信息比如pandas-2.1.4-cp312-cp312-win_amd64.whl这个文件名里cp312表示它是给 CPython 3.12 用的win_amd64表示 Windows 64 位。如果你的目标机器是 Python 3.9这个包直接装不上pip 会提示“不支持的 wheel”。这种问题只能重新下载对应版本的 whl没有任何捷径。第二个常见原因是依赖缺失。有些 whl 体积很大包含了所有依赖有些则只是薄薄的一层依赖需要单独下载。批量安装时如果少拉了某个依赖经常是一台机器装到一半报错。这时候把--find-links指向完整目录并且确保目录里包含所有依赖是最有效的解决办法。也可以用pip check来验证一下它能扫描环境中缺失或冲突的依赖。第三个原因是权限问题。系统级 Python 安装目录需要管理员权限普通用户执行pip install会得到权限错误。企业环境里要么给目标机器的部署账号提权要么用“用户级安装”pip install --user把包装到当前用户的目录下。具体选哪种取决于你的 Python 环境部署策略——我一般倾向于给运维账号最小权限然后只在安装阶段临时提权装完把权限收回去。5. 常见问题与排查技巧批量安装踩过的坑我替你先踩一遍5.1 批量安装问题速查表把这些年遇到的问题整理一下做成一张表方便你快速对照现象常见原因排查/解决方式安装过程没报错但软件没装上静默参数错误安装器实际被“跳过”或进入了其他模式查看安装器日志确认静默参数是否匹配安装器类型部分机器安装成功部分失败目标机器权限不一致或已有旧版本冲突核查本地管理员权限先卸载旧版本再安装安装到一半弹窗流程卡住静默参数缺失或拼写错误用测试机复现检查参数大小写和空格多台机器同时安装网络很卡共享目录带宽不足或安装包体积过大错峰部署按部门/网段分批执行脚本报“拒绝访问”共享目录权限没给到计算机账号或部署账号检查共享目录权限和防火墙pip 离线安装报“找不到版本”本地 whl 目录缺依赖或 pip 版本太低重新下载完整依赖集升级 pip所有机器都安装失败日志是同一行安装包文件损坏或共享路径不可达校验安装包哈希值确认路径可访问表里这些是我碰到的最高频的问题。实际情况中现象和原因往往不是一一对应的所以排查的第一步永远不是猜而是看日志、看退出码、看安装器自定义日志。5.2 一套可复用的排查思路批量安装排错我的方法论可以总结成“三层排查法”。第一层看目标机器上有没有安装记录。优先检查“控制面板-程序和功能”里是否出现了目标软件如果出现了但版本不对说明安装过程是成功的只是包选错了如果压根没出现说明安装命令没真正执行或者执行后回滚了。第二层看安装脚本或者工具的日志确认命令是否到达目标机器、退出码是多少。这一步能定位问题大概出在网络、权限还是安装包本身。第三层看安装器自己的详细日志。这一步能回答“到底是哪一步失败”比如是文件复制失败还是注册表写入失败还是重启条件不满足。很多运维朋友遇到批量安装失败第一反应是重新执行一遍。如果目标是 5 台机器重试也许能碰运气解决如果目标是 500 台盲目重试只会放大问题。正确做法是先拿一台失败机器把它的完整日志和退出码拿到手分析出根因再决定是修正脚本还是修正安装包或者先处理前置依赖最后才在更大范围内重试。5.3 长期主义视角下的四个习惯批量安装做完一次就完事这种情况不在少数。但从长期运维的角度我强烈建议养成四个习惯。第一建立“软件物料清单”。公司里常用的每款软件记录下版本号、安装包类型、静默参数、默认安装路径、常见退出码含义。这张表就是批量安装的“知识库”下次再有人问“这个软件能不能静默装”直接查表。第二统一安装包仓库。在网络共享目录里按软件名/版本号整理安装包文件名里尽量带上版本号方便脚本模糊匹配也方便回滚到旧版本。千万不要把所有包堆在一个目录里时间一长连自己都分不清哪个是哪个。第三安装日志统一收口。所有批量安装的脚本都往同一个日志目录写结构化日志。有条件的话可以把日志同步到集中日志平台对后续审计和排错帮助极大。第四批量安装之前先更新依赖基础。操作系统补丁、运行库比如常见 C 运行库、.NET 版本、Python 解释器版本这些基础组件的差异往往是批量安装失败率最高的“暗雷”。先把基线打平再推应用软件成功率几乎能提升一大截。我个人在实际操作中最深刻的体会其实是用一次难堪的教训换来的。当年用 NSIS 做一百多台的静默部署参数写成了小写/s结果第二天一大早接到好几个同事的电话说“那个安装界面从昨晚一直挂到现在”。那个经历让我彻底明白了批量安装细节决定成败测试机永远值得多跑一轮。如果这篇文章对你有用建议你从最小场景开始找一台测试机把你要部署的第一款软件用脚本装一遍哪怕只是压缩软件或者 PDF 阅读器。等这一条链路跑通了再往上加软件、加机器、加平台工具。批量安装这件事本质上不是“装得快”而是“装得准、装得稳、排障快”。把这三个目标刻在脑子里任何方案选型都不会跑偏。
返回列表