[{"data":1,"prerenderedAt":829},["ShallowReactive",2],{"navigation":3,"blogNavigation":232,"page-\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fwindows-deployment":418,"\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fwindows-deployment-surround":824},[4],{"title":5,"path":6,"stem":7,"children":8,"page":57},"Docs","\u002Fdocs","docs",[9,176,184],{"title":10,"path":11,"stem":12,"children":13,"icon":16},"简单文档","\u002Fdocs\u002F简单文档","docs\u002F1.简单文档\u002F1.index",[14,17,22,58,63,166,171],{"title":15,"path":11,"stem":12,"icon":16},"入门简介","lucide-house",{"title":18,"path":19,"stem":20,"icon":21},"安装与开发","\u002Fdocs\u002F简单文档\u002Finstallation","docs\u002F1.简单文档\u002F2.installation","lucide-play",{"title":23,"path":24,"stem":25,"children":26,"page":57},"开始写作","\u002Fdocs\u002F简单文档\u002Fwriting","docs\u002F1.简单文档\u002F3.writing",[27,32,37,42,47,52],{"title":28,"path":29,"stem":30,"icon":31},"Markdown","\u002Fdocs\u002F简单文档\u002Fwriting\u002Fmarkdown","docs\u002F1.简单文档\u002F3.writing\u002F1.markdown","simple-icons:markdown",{"title":33,"path":34,"stem":35,"icon":36},"页面 frontmatter","\u002Fdocs\u002F简单文档\u002Fwriting\u002Fpages","docs\u002F1.简单文档\u002F3.writing\u002F2.pages","lucide:file-text",{"title":38,"path":39,"stem":40,"icon":41},"目录与文件命名","\u002Fdocs\u002F简单文档\u002Fwriting\u002Ffolders","docs\u002F1.简单文档\u002F3.writing\u002F3.folders","lucide:folder",{"title":43,"path":44,"stem":45,"icon":46},"单页面示例","\u002Fdocs\u002F简单文档\u002Fwriting\u002Ffull-page-example","docs\u002F1.简单文档\u002F3.writing\u002F4.full-page-example","lucide:layout-template",{"title":48,"path":49,"stem":50,"icon":51},"内容检查与测试","\u002Fdocs\u002F简单文档\u002Fwriting\u002Ftest","docs\u002F1.简单文档\u002F3.writing\u002F5.test","lucide:shield-check",{"title":53,"path":54,"stem":55,"icon":56},"在文章中使用组件","\u002Fdocs\u002F简单文档\u002Fwriting\u002Fmdc-content","docs\u002F1.简单文档\u002F3.writing\u002F6.mdc-content","lucide-blocks",false,{"title":59,"path":60,"stem":61,"icon":62},"部署服务","\u002Fdocs\u002F简单文档\u002Fdeployment","docs\u002F1.简单文档\u002F4.deployment","lucide:cloud",{"title":64,"path":65,"stem":66,"children":67,"page":57},"组件特性","\u002Fdocs\u002F简单文档\u002Fcomponents","docs\u002F1.简单文档\u002F5.components",[68,73,77,81,85,89,93,97,101,105,110,114,118,122,126,131,136,141,146,150,154,158,162],{"title":69,"path":70,"stem":71,"icon":72},"常用组件","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fapi","docs\u002F1.简单文档\u002F5.components\u002F1.API","lucide-component",{"title":74,"path":75,"stem":76},"Alert","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Falert","docs\u002F1.简单文档\u002F5.components\u002Falert",{"title":78,"path":79,"stem":80},"Badge","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fbadge","docs\u002F1.简单文档\u002F5.components\u002Fbadge",{"title":82,"path":83,"stem":84},"Button Link","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fbutton-link","docs\u002F1.简单文档\u002F5.components\u002Fbutton-link",{"title":86,"path":87,"stem":88},"Callout","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcallout","docs\u002F1.简单文档\u002F5.components\u002Fcallout",{"title":90,"path":91,"stem":92},"Card","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcard","docs\u002F1.简单文档\u002F5.components\u002Fcard",{"title":94,"path":95,"stem":96},"Card Group","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcard-group","docs\u002F1.简单文档\u002F5.components\u002Fcard-group",{"title":98,"path":99,"stem":100},"Code Group","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcode-group","docs\u002F1.简单文档\u002F5.components\u002Fcode-group",{"title":102,"path":103,"stem":104},"Code Tree","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcode-tree","docs\u002F1.简单文档\u002F5.components\u002Fcode-tree",{"title":106,"path":107,"stem":108,"icon":109},"博客与文档内容块","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcontent-blocks","docs\u002F1.简单文档\u002F5.components\u002Fcontent-blocks","lucide-panels-top-left",{"title":111,"path":112,"stem":113},"Field","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ffield","docs\u002F1.简单文档\u002F5.components\u002Ffield",{"title":115,"path":116,"stem":117},"Field Group","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ffield-group","docs\u002F1.简单文档\u002F5.components\u002Ffield-group",{"title":119,"path":120,"stem":121},"File Tree","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ffile-tree","docs\u002F1.简单文档\u002F5.components\u002Ffile-tree",{"title":123,"path":124,"stem":125},"Icon","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ficon","docs\u002F1.简单文档\u002F5.components\u002Ficon",{"title":127,"path":128,"stem":129,"icon":130},"数据、API 与阅读交互组件","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Finteractive-blocks","docs\u002F1.简单文档\u002F5.components\u002Finteractive-blocks","lucide-table-properties",{"title":132,"path":133,"stem":134,"icon":135},"进阶组件交互演示","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Finteractive-showcase","docs\u002F1.简单文档\u002F5.components\u002Finteractive-showcase","lucide-sliders-horizontal",{"title":137,"path":138,"stem":139,"icon":140},"MDC 语法与组件注册","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fmdc-guide","docs\u002F1.简单文档\u002F5.components\u002Fmdc-guide","lucide-file-code",{"title":142,"path":143,"stem":144,"icon":145},"MDC 组件交互演示","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fmdc-showcase","docs\u002F1.简单文档\u002F5.components\u002Fmdc-showcase","lucide-mouse-pointer-click",{"title":147,"path":148,"stem":149},"Playground","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fplayground","docs\u002F1.简单文档\u002F5.components\u002Fplayground",{"title":151,"path":152,"stem":153},"Read More","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fread-more","docs\u002F1.简单文档\u002F5.components\u002Fread-more",{"title":155,"path":156,"stem":157},"Stack","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fstack","docs\u002F1.简单文档\u002F5.components\u002Fstack",{"title":159,"path":160,"stem":161},"Steps","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fsteps","docs\u002F1.简单文档\u002F5.components\u002Fsteps",{"title":163,"path":164,"stem":165},"Tabs","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ftabs","docs\u002F1.简单文档\u002F5.components\u002Ftabs",{"title":167,"path":168,"stem":169,"icon":170},"功能与路线图","\u002Fdocs\u002F简单文档\u002F功能与路线图","docs\u002F1.简单文档\u002F6.功能与路线图","lucide:map",{"title":172,"path":173,"stem":174,"icon":175},"Nuxt Studio 现状与运维说明","\u002Fdocs\u002F简单文档\u002Fnuxt-studio-upgrade-plan","docs\u002F1.简单文档\u002F7.nuxt-studio-upgrade-plan","simple-icons:nuxtdotjs",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"无人自助系统","\u002Fdocs\u002F无人自助系统","docs\u002F2.无人自助系统\u002F1.index",[181],{"title":182,"path":178,"stem":179,"icon":183},"介绍","simple-icons:opencollective",{"title":185,"path":186,"stem":187,"children":188,"icon":191},"SwitchOps 交换机巡检","\u002Fdocs\u002Fswitchops交换机巡检","docs\u002F3.SwitchOps交换机巡检\u002F1.index",[189,192,197,202,207,212,217,222,227],{"title":190,"path":186,"stem":187,"icon":191},"产品简介","lucide:house",{"title":193,"path":194,"stem":195,"icon":196},"快速开始","\u002Fdocs\u002Fswitchops交换机巡检\u002Fquick-start","docs\u002F3.SwitchOps交换机巡检\u002F2.quick-start","lucide:rocket",{"title":198,"path":199,"stem":200,"icon":201},"设备清单配置","\u002Fdocs\u002Fswitchops交换机巡检\u002Fdevice-config","docs\u002F3.SwitchOps交换机巡检\u002F3.device-config","lucide:list-tree",{"title":203,"path":204,"stem":205,"icon":206},"图形界面使用","\u002Fdocs\u002Fswitchops交换机巡检\u002Fgui-guide","docs\u002F3.SwitchOps交换机巡检\u002F4.gui-guide","lucide:monitor",{"title":208,"path":209,"stem":210,"icon":211},"命令行使用","\u002Fdocs\u002Fswitchops交换机巡检\u002Fcli-guide","docs\u002F3.SwitchOps交换机巡检\u002F5.cli-guide","lucide:square-terminal",{"title":213,"path":214,"stem":215,"icon":216},"报告与历史数据","\u002Fdocs\u002Fswitchops交换机巡检\u002Freports-history","docs\u002F3.SwitchOps交换机巡检\u002F6.reports-history","lucide:file-chart-column",{"title":218,"path":219,"stem":220,"icon":221},"高级配置","\u002Fdocs\u002Fswitchops交换机巡检\u002Fadvanced-config","docs\u002F3.SwitchOps交换机巡检\u002F7.advanced-config","lucide:settings",{"title":223,"path":224,"stem":225,"icon":226},"Windows 打包部署","\u002Fdocs\u002Fswitchops交换机巡检\u002Fwindows-deployment","docs\u002F3.SwitchOps交换机巡检\u002F8.windows-deployment","lucide:package",{"title":228,"path":229,"stem":230,"icon":231},"故障排查与安全","\u002Fdocs\u002Fswitchops交换机巡检\u002Ftroubleshooting-security","docs\u002F3.SwitchOps交换机巡检\u002F9.troubleshooting-security","lucide:shield-alert",[233],{"title":234,"path":235,"stem":236,"children":237,"page":57},"Blog","\u002Fblog","blog",[238,401,410],{"title":239,"path":240,"stem":241,"children":242,"page":57},"技术栈","\u002Fblog\u002F技术栈","blog\u002F1.技术栈",[243,248,253,258,262,267,271,276,280,284,289,294,299,303,307,311,315,319,324,328,333,338,343,347,352,357,362,367,372,376,381,386,391,396],{"title":244,"path":245,"stem":246,"icon":247},"最近给文档站补了些什么","\u002Fblog\u002F技术栈\u002Festel-docs-recent-updates","blog\u002F1.技术栈\u002F968.estel-docs-recent-updates","lucide:blocks",{"title":249,"path":250,"stem":251,"icon":252},"国产化终端能上办公网，却登录不了 OA：一次网络准入故障排查","\u002Fblog\u002F技术栈\u002F国产化终端办公oa网络准入故障排查","blog\u002F1.技术栈\u002F969.国产化终端办公OA网络准入故障排查","lucide:network",{"title":254,"path":255,"stem":256,"icon":257},"准备新的插件","\u002Fblog\u002F技术栈\u002F新的插件","blog\u002F1.技术栈\u002F970.新的插件","simple-icons:debian",{"title":259,"path":260,"stem":261,"icon":257},"防于未然，先固不破 — Debian 12 快速加固实战","\u002Fblog\u002F技术栈\u002F服务器加固实战","blog\u002F1.技术栈\u002F971.服务器加固实战",{"title":263,"path":264,"stem":265,"icon":266},"nmap高级应用技巧-实战","\u002Fblog\u002F技术栈\u002Fnmap高级应用技巧-实战","blog\u002F1.技术栈\u002F972.nmap高级应用技巧-实战","simple-icons:openstreetmap",{"title":268,"path":269,"stem":270,"icon":266},"nmap高级应用技巧-NSE","\u002Fblog\u002F技术栈\u002Fnmap高级应用技巧-nse","blog\u002F1.技术栈\u002F973.nmap高级应用技巧-NSE",{"title":272,"path":273,"stem":274,"icon":275},"部分vue组件语法预览","\u002Fblog\u002F技术栈\u002F部分组件语法展示","blog\u002F1.技术栈\u002F974.部分组件语法展示","simple-icons:vuedotjs",{"title":277,"path":278,"stem":279,"icon":175},"新的文档渲染样式","\u002Fblog\u002F技术栈\u002F新的文档渲染样式","blog\u002F1.技术栈\u002F975.新的文档渲染样式",{"title":281,"path":282,"stem":283,"icon":175},"Nuxt 微信分享接口","\u002Fblog\u002F技术栈\u002Fnuxt-微信分享接口","blog\u002F1.技术栈\u002F976.Nuxt 微信分享接口",{"title":285,"path":286,"stem":287,"icon":288},"AI复合应用 合同审查","\u002Fblog\u002F技术栈\u002Fai复合应用-合同审查","blog\u002F1.技术栈\u002F978.AI复合应用 合同审查","simple-icons:openai",{"title":290,"path":291,"stem":292,"icon":293},"Kali 安装 GVM","\u002Fblog\u002F技术栈\u002Fkali-安装-gvm","blog\u002F1.技术栈\u002F979.Kali 安装 GVM","simple-icons:kalilinux",{"title":295,"path":296,"stem":297,"icon":298},"GPT-5","\u002Fblog\u002F技术栈\u002Fgpt5","blog\u002F1.技术栈\u002F980.GPT5","simple-icons:powershell",{"title":300,"path":301,"stem":302,"icon":288},"使用 AI 守护内网安全","\u002Fblog\u002F技术栈\u002F使用-ai-守护内网安全","blog\u002F1.技术栈\u002F981.使用 AI 守护内网安全",{"title":304,"path":305,"stem":306,"icon":266},"系统安全扫描工具命令集合","\u002Fblog\u002F技术栈\u002F系统安全扫描工具命令集合","blog\u002F1.技术栈\u002F982.系统安全扫描工具命令集合",{"title":308,"path":309,"stem":310},"用 MDC 组织技术文章","\u002Fblog\u002F技术栈\u002Fmdc-article-example","blog\u002F1.技术栈\u002F983.mdc-article-example",{"title":312,"path":313,"stem":314,"icon":293},"系统安全综合评估报告","\u002Fblog\u002F技术栈\u002F系统安全综合评估报告","blog\u002F1.技术栈\u002F983.系统安全综合评估报告",{"title":316,"path":317,"stem":318},"用交互组件写一份技术说明","\u002Fblog\u002F技术栈\u002Fmdc-interactive-example","blog\u002F1.技术栈\u002F984.mdc-interactive-example",{"title":320,"path":321,"stem":322,"icon":323},"树莓派安装 Kali Linux","\u002Fblog\u002F技术栈\u002F树莓派安装-kali-linux","blog\u002F1.技术栈\u002F984.树莓派安装 Kali Linux","simple-icons:raspberrypi",{"title":325,"path":326,"stem":327,"icon":175},"Nuxt UI Pro","\u002Fblog\u002F技术栈\u002Fnuxt-ui-pro","blog\u002F1.技术栈\u002F985.Nuxt UI Pro",{"title":329,"path":330,"stem":331,"icon":332},"Supabase 阿里云短信","\u002Fblog\u002F技术栈\u002Fsupabase-阿里云短信","blog\u002F1.技术栈\u002F986.Supabase 阿里云短信","simple-icons:alibabacloud",{"title":334,"path":335,"stem":336,"icon":337},"Coolify","\u002Fblog\u002F技术栈\u002Fcoolify","blog\u002F1.技术栈\u002F987.Coolify","simple-icons:chai",{"title":339,"path":340,"stem":341,"icon":342},"Python 代码规范","\u002Fblog\u002F技术栈\u002Fpython-代码规范","blog\u002F1.技术栈\u002F988.Python 代码规范","simple-icons:python",{"title":344,"path":345,"stem":346,"icon":175},"Nuxt3 代码规范","\u002Fblog\u002F技术栈\u002Fnuxt3-代码规范","blog\u002F1.技术栈\u002F989.Nuxt3 代码规范",{"title":348,"path":349,"stem":350,"icon":351},"Linux 系统 Swap 分区配置指南","\u002Fblog\u002F技术栈\u002Flinux-系统-swap-分区配置指南","blog\u002F1.技术栈\u002F990.Linux 系统 Swap 分区配置指南","simple-icons:linux",{"title":353,"path":354,"stem":355,"icon":356},"从Supabase迁移到Appwrite","\u002Fblog\u002F技术栈\u002F从supabase迁移到appwrite","blog\u002F1.技术栈\u002F991.从Supabase迁移到Appwrite","simple-icons:supabase",{"title":358,"path":359,"stem":360,"icon":361},"AppWrite 项目资源占用情况","\u002Fblog\u002F技术栈\u002Fappwrite-项目资源占用情况","blog\u002F1.技术栈\u002F992.AppWrite 项目资源占用情况","simple-icons:appwrite",{"title":363,"path":364,"stem":365,"icon":366},"Docker 里配置hosts","\u002Fblog\u002F技术栈\u002Fdocker-里配置hosts","blog\u002F1.技术栈\u002F993.Docker 里配置hosts","simple-icons:docker",{"title":368,"path":369,"stem":370,"icon":371},"MySQL 中如何忽略表名的大小写","\u002Fblog\u002F技术栈\u002Fmysql-中如何忽略表名的大小写","blog\u002F1.技术栈\u002F994.MySQL 中如何忽略表名的大小写","simple-icons:mysql",{"title":373,"path":374,"stem":375,"icon":257},"Debian 12 安装nodejs","\u002Fblog\u002F技术栈\u002Fdebian-12-安装nodejs","blog\u002F1.技术栈\u002F995.Debian 12 安装nodejs",{"title":377,"path":378,"stem":379,"icon":380},"Dify + Supabase：打造带数据库的AI问答机器人","\u002Fblog\u002F技术栈\u002Fdify-supabase：打造带数据库的ai问答机器人","blog\u002F1.技术栈\u002F996.Dify + Supabase：打造带数据库的AI问答机器人","simple-icons:reactbootstrap",{"title":382,"path":383,"stem":384,"icon":385},"安装 VS Code到浏览器 -- Code Server","\u002Fblog\u002F技术栈\u002F安装-vs-code到浏览器-code-server-copy","blog\u002F1.技术栈\u002F996.安装 VS Code到浏览器 -- Code Server copy","simple-icons:visualstudiocode",{"title":387,"path":388,"stem":389,"icon":390},"Debian 12 云服务器初始安全设置与优化指南","\u002Fblog\u002F技术栈\u002Fdebian-12-云服务器初始安全设置与优化指南","blog\u002F1.技术栈\u002F997.Debian 12 云服务器初始安全设置与优化指南","lucide-server",{"title":392,"path":393,"stem":394,"icon":395},"Iperf3 万兆网络打流测试指南","\u002Fblog\u002F技术栈\u002Fiperf3-万兆网络打流测试指南","blog\u002F1.技术栈\u002F998.Iperf3 万兆网络打流测试指南","lucide-network",{"title":397,"path":398,"stem":399,"icon":400},"GROK3 and Deepseek","\u002Fblog\u002F技术栈\u002Fgrok3-and-deepseek","blog\u002F1.技术栈\u002F999.GROK3-and-Deepseek","lucide-brain",{"title":402,"path":403,"stem":404,"children":405,"page":57},"AI","\u002Fblog\u002Fai","blog\u002F2.AI",[406],{"title":407,"path":408,"stem":409,"icon":337},"AI最佳实践","\u002Fblog\u002Fai\u002Fai","blog\u002F2.AI\u002F01.AI",{"title":411,"path":412,"stem":413,"children":414,"page":57},"生活","\u002Fblog\u002F生活","blog\u002F3.生活",[415],{"title":411,"path":416,"stem":417,"icon":337},"\u002Fblog\u002F生活\u002F生活","blog\u002F3.生活\u002F01.生活",{"id":419,"title":223,"badges":420,"body":421,"date":420,"description":816,"draft":57,"extension":817,"fullpage":57,"icon":420,"links":420,"meta":818,"navBadges":420,"navigation":819,"path":224,"rawbody":820,"seo":821,"stem":225,"updated":822,"__hash__":823},"docs\u002Fdocs\u002F3.SwitchOps交换机巡检\u002F8.windows-deployment.md",null,{"type":422,"value":423,"toc":806},"minimark",[424,428,432,461,464,467,502,505,514,517,520,529,532,618,621,629,632,638,657,663,666,710,713,716,749,752,755,758,775,778,787,790,793,799,802],[425,426,427],"h2",{"id":427},"构建环境",[429,430,431],"p",{},"Windows EXE 应在 Windows 系统中构建。准备：",[433,434,435,439,442,450],"ul",{},[436,437,438],"li",{},"Python 3.10 或更高版本；",[436,440,441],{},"项目完整源码；",[436,443,444,445,449],{},"能够安装 ",[446,447,448],"code",{},"requirements.txt"," 依赖的网络或离线包；",[436,451,452,453,456,457,460],{},"足够的磁盘空间用于 PyInstaller 的 ",[446,454,455],{},"build\u002F"," 和 ",[446,458,459],{},"dist\u002F"," 目录。",[425,462,463],{"id":463},"安装构建依赖",[429,465,466],{},"在项目根目录打开 PowerShell：",[468,469,474],"pre",{"className":470,"code":471,"language":472,"meta":473,"style":473},"language-powershell shiki shiki-themes github-light github-light github-dark vitesse-light vitesse-dark catppuccin-latte catppuccin-mocha one-light one-dark-pro material-theme-lighter material-theme-palenight min-light min-dark","py -3 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\n","powershell","",[446,475,476,484,490,496],{"__ignoreMap":473},[477,478,481],"span",{"class":479,"line":480},"line",1,[477,482,483],{},"py -3 -m venv .venv\n",[477,485,487],{"class":479,"line":486},2,[477,488,489],{},".\\.venv\\Scripts\\Activate.ps1\n",[477,491,493],{"class":479,"line":492},3,[477,494,495],{},"python -m pip install --upgrade pip\n",[477,497,499],{"class":479,"line":498},4,[477,500,501],{},"python -m pip install -r requirements.txt\n",[429,503,504],{},"确认 PyInstaller 可用：",[468,506,508],{"className":470,"code":507,"language":472,"meta":473,"style":473},"pyinstaller --version\n",[446,509,510],{"__ignoreMap":473},[477,511,512],{"class":479,"line":480},[477,513,507],{},[425,515,516],{"id":516},"执行打包",[429,518,519],{},"运行项目提供的脚本：",[468,521,523],{"className":470,"code":522,"language":472,"meta":473,"style":473},".\\build_exe.bat\n",[446,524,525],{"__ignoreMap":473},[477,526,527],{"class":479,"line":480},[477,528,522],{},[429,530,531],{},"脚本使用的关键参数：",[533,534,535,548],"table",{},[536,537,538],"thead",{},[539,540,541,545],"tr",{},[542,543,544],"th",{},"参数",[542,546,547],{},"作用",[549,550,551,562,572,586,600],"tbody",{},[539,552,553,559],{},[554,555,556],"td",{},[446,557,558],{},"--onefile",[554,560,561],{},"生成单文件 EXE。",[539,563,564,569],{},[554,565,566],{},[446,567,568],{},"--windowed",[554,570,571],{},"运行 GUI 时不额外打开控制台窗口。",[539,573,574,579],{},[554,575,576],{},[446,577,578],{},"--name",[554,580,581,582,585],{},"输出名称为 ",[446,583,584],{},"SwitchOps巡检工具","。",[539,587,588,593],{},[554,589,590],{},[446,591,592],{},"--icon",[554,594,595,596,599],{},"存在 ",[446,597,598],{},"assets\u002Fapp.ico"," 时设置程序图标。",[539,601,602,607],{},[554,603,604],{},[446,605,606],{},"--add-data",[554,608,609,610,613,614,617],{},"将构建时的 ",[446,611,612],{},"config","、",[446,615,616],{},"assets"," 作为打包数据加入。",[429,619,620],{},"构建产物位于：",[468,622,627],{"className":623,"code":625,"language":626,"meta":473},[624],"language-text","dist\\SwitchOps巡检工具.exe\n","text",[446,628,625],{"__ignoreMap":473},[425,630,631],{"id":631},"推荐交付目录",[468,633,636],{"className":634,"code":635,"language":626,"meta":473},[624],"SwitchOps\u002F\n├── SwitchOps巡检工具.exe\n├── config\u002F\n│   ├── devices.yaml\n│   ├── commands.yaml\n│   └── settings.yaml\n└── outputs\u002F\n",[446,637,635],{"__ignoreMap":473},[639,640,642],"callout",{"type":641},"important",[429,643,644,645,649,650,653,654,656],{},"当前程序在 EXE 模式下从 ",[646,647,648],"strong",{},"EXE 所在目录","读取 ",[446,651,652],{},"config\u002F","。交付时必须把三个 YAML 配置文件放在 EXE 同级的 ",[446,655,612],{}," 目录中，不能只复制 EXE。",[429,658,659,662],{},[446,660,661],{},"outputs\u002F"," 可以不预先创建，程序首次运行时会自动创建；提前创建有助于设置访问控制和备份策略。",[425,664,665],{"id":665},"首次部署检查",[667,668,669,675,682,692,695,698,701,704],"ol",{},[436,670,671,672,585],{},"将完整目录复制到目标 Windows 电脑的固定位置，例如 ",[446,673,674],{},"D:\\SwitchOps",[436,676,677,678,681],{},"从示例创建 ",[446,679,680],{},"config\\devices.yaml","，填写一台测试设备。",[436,683,684,685,456,688,691],{},"确认 ",[446,686,687],{},"commands.yaml",[446,689,690],{},"settings.yaml"," 存在。",[436,693,694],{},"确认当前用户对程序目录和输出目录有读写权限。",[436,696,697],{},"检查到交换机管理 IP 的路由和 TCP 22 端口。",[436,699,700],{},"双击 EXE，加载设备清单。",[436,702,703],{},"先巡检单台设备，再执行全量巡检。",[436,705,706,707,585],{},"检查原始回显、Excel、日志和 ",[446,708,709],{},"history.db",[425,711,712],{"id":712},"配置与版本更新",[429,714,715],{},"升级 EXE 时建议：",[667,717,718,721,729,732,740,746],{},[436,719,720],{},"退出正在运行的程序。",[436,722,723,724,456,726,585],{},"备份整个 ",[446,725,652],{},[446,727,728],{},"outputs\u002Fhistory.db",[436,730,731],{},"用新版本替换 EXE。",[436,733,734,735,613,737,739],{},"对比新旧 ",[446,736,687],{},[446,738,690],{},"，合并新增配置项。",[436,741,742,743,585],{},"不要用示例文件覆盖真实 ",[446,744,745],{},"devices.yaml",[436,747,748],{},"使用一台测试设备完成回归验证。",[429,750,751],{},"配置文件与 EXE 分开管理，便于更新程序时保留设备清单，也避免把真实账号密码硬编码到发布物中。",[425,753,754],{"id":754},"杀毒软件误报",[429,756,757],{},"PyInstaller 单文件程序会在运行时释放组件，部分安全软件可能产生误报。建议：",[433,759,760,763,766,769,772],{},[436,761,762],{},"从可信构建机生成发布物并记录源码版本。",[436,764,765],{},"对发布物计算并留存 SHA-256 摘要。",[436,767,768],{},"保留依赖清单和构建日志，便于安全人员复核。",[436,770,771],{},"由终端安全管理员按流程检测后加入白名单。",[436,773,774],{},"不要直接关闭杀毒软件或让普通用户自行绕过安全策略。",[429,776,777],{},"PowerShell 计算摘要：",[468,779,781],{"className":470,"code":780,"language":472,"meta":473,"style":473},"Get-FileHash .\\dist\\SwitchOps巡检工具.exe -Algorithm SHA256\n",[446,782,783],{"__ignoreMap":473},[477,784,785],{"class":479,"line":480},[477,786,780],{},[425,788,789],{"id":789},"源码模式部署",[429,791,792],{},"如果需要使用 CLI、计划任务或更方便地调试日志，可以保留源码和虚拟环境：",[468,794,797],{"className":795,"code":796,"language":626,"meta":473},[624],"SwitchOps\u002F\n├── .venv\u002F\n├── switch_ops\u002F\n├── config\u002F\n├── outputs\u002F\n├── cli.py\n├── gui.py\n├── main.py\n└── requirements.txt\n",[446,798,796],{"__ignoreMap":473},[429,800,801],{},"源码模式更适合运维管理机；单文件 EXE 更适合固定功能的一线桌面交付。",[803,804,805],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .code-theme-vitesse-light .shiki span {color: var(--shiki-code-theme-vitesse-light);background: var(--shiki-code-theme-vitesse-light-bg);font-style: var(--shiki-code-theme-vitesse-light-font-style);font-weight: var(--shiki-code-theme-vitesse-light-font-weight);text-decoration: var(--shiki-code-theme-vitesse-light-text-decoration);}html.code-theme-vitesse-light .shiki span {color: var(--shiki-code-theme-vitesse-light);background: var(--shiki-code-theme-vitesse-light-bg);font-style: var(--shiki-code-theme-vitesse-light-font-style);font-weight: var(--shiki-code-theme-vitesse-light-font-weight);text-decoration: var(--shiki-code-theme-vitesse-light-text-decoration);}html .code-theme-vitesse-dark .shiki span {color: var(--shiki-code-theme-vitesse-dark);background: var(--shiki-code-theme-vitesse-dark-bg);font-style: var(--shiki-code-theme-vitesse-dark-font-style);font-weight: var(--shiki-code-theme-vitesse-dark-font-weight);text-decoration: var(--shiki-code-theme-vitesse-dark-text-decoration);}html.code-theme-vitesse-dark .shiki span {color: var(--shiki-code-theme-vitesse-dark);background: var(--shiki-code-theme-vitesse-dark-bg);font-style: var(--shiki-code-theme-vitesse-dark-font-style);font-weight: var(--shiki-code-theme-vitesse-dark-font-weight);text-decoration: var(--shiki-code-theme-vitesse-dark-text-decoration);}html .code-theme-catppuccin-light .shiki span {color: var(--shiki-code-theme-catppuccin-light);background: var(--shiki-code-theme-catppuccin-light-bg);font-style: var(--shiki-code-theme-catppuccin-light-font-style);font-weight: var(--shiki-code-theme-catppuccin-light-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-light-text-decoration);}html.code-theme-catppuccin-light .shiki span {color: var(--shiki-code-theme-catppuccin-light);background: var(--shiki-code-theme-catppuccin-light-bg);font-style: var(--shiki-code-theme-catppuccin-light-font-style);font-weight: var(--shiki-code-theme-catppuccin-light-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-light-text-decoration);}html .code-theme-catppuccin-dark .shiki span {color: var(--shiki-code-theme-catppuccin-dark);background: var(--shiki-code-theme-catppuccin-dark-bg);font-style: var(--shiki-code-theme-catppuccin-dark-font-style);font-weight: var(--shiki-code-theme-catppuccin-dark-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-dark-text-decoration);}html.code-theme-catppuccin-dark .shiki span {color: var(--shiki-code-theme-catppuccin-dark);background: var(--shiki-code-theme-catppuccin-dark-bg);font-style: var(--shiki-code-theme-catppuccin-dark-font-style);font-weight: var(--shiki-code-theme-catppuccin-dark-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-dark-text-decoration);}html .code-theme-one-light .shiki span {color: var(--shiki-code-theme-one-light);background: var(--shiki-code-theme-one-light-bg);font-style: var(--shiki-code-theme-one-light-font-style);font-weight: var(--shiki-code-theme-one-light-font-weight);text-decoration: var(--shiki-code-theme-one-light-text-decoration);}html.code-theme-one-light .shiki span {color: var(--shiki-code-theme-one-light);background: var(--shiki-code-theme-one-light-bg);font-style: var(--shiki-code-theme-one-light-font-style);font-weight: var(--shiki-code-theme-one-light-font-weight);text-decoration: var(--shiki-code-theme-one-light-text-decoration);}html .code-theme-one-dark .shiki span {color: var(--shiki-code-theme-one-dark);background: var(--shiki-code-theme-one-dark-bg);font-style: var(--shiki-code-theme-one-dark-font-style);font-weight: var(--shiki-code-theme-one-dark-font-weight);text-decoration: var(--shiki-code-theme-one-dark-text-decoration);}html.code-theme-one-dark .shiki span {color: var(--shiki-code-theme-one-dark);background: var(--shiki-code-theme-one-dark-bg);font-style: var(--shiki-code-theme-one-dark-font-style);font-weight: var(--shiki-code-theme-one-dark-font-weight);text-decoration: var(--shiki-code-theme-one-dark-text-decoration);}html .code-theme-material-light .shiki span {color: var(--shiki-code-theme-material-light);background: var(--shiki-code-theme-material-light-bg);font-style: var(--shiki-code-theme-material-light-font-style);font-weight: var(--shiki-code-theme-material-light-font-weight);text-decoration: var(--shiki-code-theme-material-light-text-decoration);}html.code-theme-material-light .shiki span {color: var(--shiki-code-theme-material-light);background: var(--shiki-code-theme-material-light-bg);font-style: var(--shiki-code-theme-material-light-font-style);font-weight: var(--shiki-code-theme-material-light-font-weight);text-decoration: var(--shiki-code-theme-material-light-text-decoration);}html .code-theme-material-dark .shiki span {color: var(--shiki-code-theme-material-dark);background: var(--shiki-code-theme-material-dark-bg);font-style: var(--shiki-code-theme-material-dark-font-style);font-weight: var(--shiki-code-theme-material-dark-font-weight);text-decoration: var(--shiki-code-theme-material-dark-text-decoration);}html.code-theme-material-dark .shiki span {color: var(--shiki-code-theme-material-dark);background: var(--shiki-code-theme-material-dark-bg);font-style: var(--shiki-code-theme-material-dark-font-style);font-weight: var(--shiki-code-theme-material-dark-font-weight);text-decoration: var(--shiki-code-theme-material-dark-text-decoration);}html .code-theme-min-light .shiki span {color: var(--shiki-code-theme-min-light);background: var(--shiki-code-theme-min-light-bg);font-style: var(--shiki-code-theme-min-light-font-style);font-weight: var(--shiki-code-theme-min-light-font-weight);text-decoration: var(--shiki-code-theme-min-light-text-decoration);}html.code-theme-min-light .shiki span {color: var(--shiki-code-theme-min-light);background: var(--shiki-code-theme-min-light-bg);font-style: var(--shiki-code-theme-min-light-font-style);font-weight: var(--shiki-code-theme-min-light-font-weight);text-decoration: var(--shiki-code-theme-min-light-text-decoration);}html .code-theme-min-dark .shiki span {color: var(--shiki-code-theme-min-dark);background: var(--shiki-code-theme-min-dark-bg);font-style: var(--shiki-code-theme-min-dark-font-style);font-weight: var(--shiki-code-theme-min-dark-font-weight);text-decoration: var(--shiki-code-theme-min-dark-text-decoration);}html.code-theme-min-dark .shiki span {color: var(--shiki-code-theme-min-dark);background: var(--shiki-code-theme-min-dark-bg);font-style: var(--shiki-code-theme-min-dark-font-style);font-weight: var(--shiki-code-theme-min-dark-font-weight);text-decoration: var(--shiki-code-theme-min-dark-text-decoration);}",{"title":473,"searchDepth":486,"depth":486,"links":807},[808,809,810,811,812,813,814,815],{"id":427,"depth":486,"text":427},{"id":463,"depth":486,"text":463},{"id":516,"depth":486,"text":516},{"id":631,"depth":486,"text":631},{"id":665,"depth":486,"text":665},{"id":712,"depth":486,"text":712},{"id":754,"depth":486,"text":754},{"id":789,"depth":486,"text":789},"使用 PyInstaller 构建 SwitchOps 单文件 EXE，并按推荐目录交付配置和输出数据。","md",{},{"icon":226},"---\ntitle: Windows 打包部署\ndescription: 使用 PyInstaller 构建 SwitchOps 单文件 EXE，并按推荐目录交付配置和输出数据。\nupdated: 2026-09-04\nnavigation:\n  icon: lucide:package\n---\n\n## 构建环境\n\nWindows EXE 应在 Windows 系统中构建。准备：\n\n- Python 3.10 或更高版本；\n- 项目完整源码；\n- 能够安装 `requirements.txt` 依赖的网络或离线包；\n- 足够的磁盘空间用于 PyInstaller 的 `build\u002F` 和 `dist\u002F` 目录。\n\n## 安装构建依赖\n\n在项目根目录打开 PowerShell：\n\n```powershell\npy -3 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\n```\n\n确认 PyInstaller 可用：\n\n```powershell\npyinstaller --version\n```\n\n## 执行打包\n\n运行项目提供的脚本：\n\n```powershell\n.\\build_exe.bat\n```\n\n脚本使用的关键参数：\n\n| 参数 | 作用 |\n| --- | --- |\n| `--onefile` | 生成单文件 EXE。 |\n| `--windowed` | 运行 GUI 时不额外打开控制台窗口。 |\n| `--name` | 输出名称为 `SwitchOps巡检工具`。 |\n| `--icon` | 存在 `assets\u002Fapp.ico` 时设置程序图标。 |\n| `--add-data` | 将构建时的 `config`、`assets` 作为打包数据加入。 |\n\n构建产物位于：\n\n```text\ndist\\SwitchOps巡检工具.exe\n```\n\n## 推荐交付目录\n\n```text\nSwitchOps\u002F\n├── SwitchOps巡检工具.exe\n├── config\u002F\n│   ├── devices.yaml\n│   ├── commands.yaml\n│   └── settings.yaml\n└── outputs\u002F\n```\n\n::callout{type=\"important\"}\n当前程序在 EXE 模式下从 **EXE 所在目录**读取 `config\u002F`。交付时必须把三个 YAML 配置文件放在 EXE 同级的 `config` 目录中，不能只复制 EXE。\n::\n\n`outputs\u002F` 可以不预先创建，程序首次运行时会自动创建；提前创建有助于设置访问控制和备份策略。\n\n## 首次部署检查\n\n1. 将完整目录复制到目标 Windows 电脑的固定位置，例如 `D:\\SwitchOps`。\n2. 从示例创建 `config\\devices.yaml`，填写一台测试设备。\n3. 确认 `commands.yaml` 和 `settings.yaml` 存在。\n4. 确认当前用户对程序目录和输出目录有读写权限。\n5. 检查到交换机管理 IP 的路由和 TCP 22 端口。\n6. 双击 EXE，加载设备清单。\n7. 先巡检单台设备，再执行全量巡检。\n8. 检查原始回显、Excel、日志和 `history.db`。\n\n## 配置与版本更新\n\n升级 EXE 时建议：\n\n1. 退出正在运行的程序。\n2. 备份整个 `config\u002F` 和 `outputs\u002Fhistory.db`。\n3. 用新版本替换 EXE。\n4. 对比新旧 `commands.yaml`、`settings.yaml`，合并新增配置项。\n5. 不要用示例文件覆盖真实 `devices.yaml`。\n6. 使用一台测试设备完成回归验证。\n\n配置文件与 EXE 分开管理，便于更新程序时保留设备清单，也避免把真实账号密码硬编码到发布物中。\n\n## 杀毒软件误报\n\nPyInstaller 单文件程序会在运行时释放组件，部分安全软件可能产生误报。建议：\n\n- 从可信构建机生成发布物并记录源码版本。\n- 对发布物计算并留存 SHA-256 摘要。\n- 保留依赖清单和构建日志，便于安全人员复核。\n- 由终端安全管理员按流程检测后加入白名单。\n- 不要直接关闭杀毒软件或让普通用户自行绕过安全策略。\n\nPowerShell 计算摘要：\n\n```powershell\nGet-FileHash .\\dist\\SwitchOps巡检工具.exe -Algorithm SHA256\n```\n\n## 源码模式部署\n\n如果需要使用 CLI、计划任务或更方便地调试日志，可以保留源码和虚拟环境：\n\n```text\nSwitchOps\u002F\n├── .venv\u002F\n├── switch_ops\u002F\n├── config\u002F\n├── outputs\u002F\n├── cli.py\n├── gui.py\n├── main.py\n└── requirements.txt\n```\n\n源码模式更适合运维管理机；单文件 EXE 更适合固定功能的一线桌面交付。\n",{"title":223,"description":816},"2026-09-04","79rKMpRKkFUJSIm3NK3tERdcjNsRgOM-NE_LNZbmR6k",[825,827],{"title":218,"path":219,"stem":220,"description":826,"icon":221,"children":-1},"调整 SwitchOps 的并发、重试、超时、告警阈值、输出位置和厂商命令模板。",{"title":228,"path":229,"stem":230,"description":828,"icon":231,"children":-1},"排查 SwitchOps 的配置、SSH、设备类型、命令、Excel 和 EXE 问题，并落实安全使用要求。",1791307034361]