<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>自动化 on Zhang's Notes</title><link>https://zhangsnotes.com/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/</link><description>Recent content in 自动化 on Zhang's Notes</description><generator>Hugo</generator><language>zh-CN</language><copyright>Zhang's Notes</copyright><lastBuildDate>Mon, 28 Sep 2026 17:00:38 +0800</lastBuildDate><atom:link href="https://zhangsnotes.com/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>WindowsDeveloperConfig：用一套 PowerShell 脚本快速配置 Windows 开发环境</title><link>https://zhangsnotes.com/posts/windows-developer-config/</link><pubDate>Mon, 28 Sep 2026 16:40:00 +0800</pubDate><guid>https://zhangsnotes.com/posts/windows-developer-config/</guid><description>梳理微软 WindowsDeveloperConfig 项目：bootstrap + 11 个 phase 的 PowerShell 自动化配置流程，覆盖 WinGet 软件、注册表、Terminal、字体、Copilot、WSL 与重启恢复机制。</description><content:encoded><![CDATA[<p><img src="/posts/windows-developer-config/cover.avif" alt="cover"></p>
<blockquote>
<p>图片来自 <code>https://www.pexels.com/zh-cn/photo/4709286/</code></p>
</blockquote>
<h2 id="tldr--read-here">TLDR : <a href="#%e5%8d%81%e4%b9%9d%e5%a6%82%e6%9e%9c%e5%8f%aa%e8%ae%b0%e4%bd%8f%e4%b8%80%e5%8f%a5%e8%af%9d">Read here</a>
</h2>
<hr>
<p>最近看到微软的 <code>WindowsDeveloperConfig</code> 项目，感觉它比较适合重新安装 Windows 之后使用。</p>
<p>它做的事情其实很直接：</p>
<blockquote>
<p>把一台刚安装好的 Windows 11，配置成一台可以直接开始写代码的开发机。</p>
</blockquote>
<p>它不只是安装几个软件，而是把 <strong>开发工具、Windows 系统设置、Windows Terminal、PowerShell、字体、GitHub Copilot、WSL + Ubuntu</strong> 一起处理掉。</p>
<p>而且它不是简单地执行一遍命令。</p>
<p>整个流程设计成了：</p>
<ul>
<li>已经安装的东西不重复安装</li>
<li>已经修改好的设置不重复修改</li>
<li>某一步失败可以继续重跑</li>
<li>WSL 安装需要重启时，可以自动保存进度</li>
<li>重启登录后可以继续执行</li>
<li>生产版本的 PowerShell 脚本带 Microsoft Authenticode 签名验证</li>
<li>最后会给出哪些项目修改了、哪些已经正常、哪些失败的汇总</li>
</ul>
<p>目前仓库的 <code>windows-dev-config</code> 已经是一个相对完整的 PowerShell 自动化安装器，而不是单独的一份配置文件。微软官方文档也把 Windows Developer Config 定义为用于将全新 Windows 配置成开发环境的一套开源配置。(<a href="https://github.com/microsoft/WindowsDeveloperConfig/?utm_source=chatgpt.com" title="GitHub - microsoft/WindowsDeveloperConfig: Automate the setup and configuration of your Windows development environment. · GitHub" target="_blank" rel="noopener noreferrer">GitHub</a>
)</p>
<hr>
<h2 id="一先说它到底会做什么">一、先说它到底会做什么</h2>
<p>如果直接运行 Full 配置，它大概会按照下面的顺序执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">准备环境
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">PowerShell 7
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">WinGet
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">安装开发软件
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Windows 系统设置
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">文件资源管理器
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">任务栏 / 开始菜单 / 搜索
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Edge
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">开发字体
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Windows Terminal
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">PowerShell Profile
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">GitHub Copilot
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">WSL + Ubuntu
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">重启
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">自动恢复</span></span></code></pre></div>
</div>
<p>当前源码把整个过程拆成了 <strong>11 个 phase</strong>，每一个 phase 对应 <code>steps/</code> 下面的一个 PowerShell 文件。<code>dev-config.ps1</code> 负责按照固定顺序加载和执行这些 phase。</p>
<hr>
<h2 id="二它并不是无脑执行命令">二、它并不是“无脑执行命令”</h2>
<p>这个项目比较值得看的地方，其实是它的执行方式。</p>
<p>普通的安装脚本一般是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">安装</span> <span class="n">A</span>
</span></span><span class="line"><span class="cl"><span class="n">安装</span> <span class="n">B</span>
</span></span><span class="line"><span class="cl"><span class="n">修改</span> <span class="n">C</span>
</span></span><span class="line"><span class="cl"><span class="n">修改</span> <span class="n">D</span></span></span></code></pre></div>
</div>
<p>如果执行到 C 的时候失败了，通常只能重新跑一遍。</p>
<p>WindowsDeveloperConfig 则给每一个操作定义了：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Check
</span></span><span class="line"><span class="cl">Apply
</span></span><span class="line"><span class="cl">Verify</span></span></code></pre></div>
</div>
<p>也就是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">检查
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">需要修改？
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">执行修改
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">再次检查
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">确认真的成功</span></span></code></pre></div>
</div>
<p>例如安装 VS Code。</p>
<p>逻辑不是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">winget</span> <span class="n">install</span> <span class="n">vscode</span></span></span></code></pre></div>
</div>
<p>然后就认为成功。</p>
<p>而是先检查：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">VS Code 是否已经安装？
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">是 → already OK
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">否
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">执行安装
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">再次检查
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">确认安装成功</span></span></code></pre></div>
</div>
<p>如果执行成功，但是后面的检查发现仍然没有达到目标状态，它会把这个步骤视为失败，而不是简单打印一个“安装成功”。</p>
<p>这个逻辑由：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/_step-runner.ps1</span></span></code></pre></div>
</div>
<p>统一实现。</p>
<p>所以它具备一个比较重要的特点：</p>
<p><strong>重复执行是安全的。</strong></p>
<hr>
<h2 id="三入口脚本怎么工作">三、入口脚本怎么工作</h2>
<p>整个项目最外面的入口是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">bootstrap.ps1</span></span></code></pre></div>
</div>
<p>它负责的事情不是安装 VS Code、Git 之类的软件。</p>
<p>它更像一个“安装器”。</p>
<p>执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">irm </span><span class="n">https</span><span class="err">:</span><span class="p">//</span><span class="n">raw</span><span class="p">.</span><span class="py">githubusercontent</span><span class="p">.</span><span class="n">com</span><span class="p">/</span><span class="n">microsoft</span><span class="p">/</span><span class="n">WindowsDeveloperConfig</span><span class="p">/</span><span class="n">main</span><span class="p">/</span><span class="n">src</span><span class="p">/</span><span class="nb">windows-dev</span><span class="n">-config</span><span class="p">/</span><span class="n">bootstrap</span><span class="p">.</span><span class="py">ps1</span> <span class="p">|</span> <span class="n">iex</span></span></span></code></pre></div>
</div>
<p>之后，Bootstrap 会：</p>
<ol>
<li>解析指定的 branch/tag/commit</li>
<li>检查当前是不是管理员</li>
<li>如果不是，则请求 UAC</li>
<li>下载对应版本的项目</li>
<li>验证脚本签名</li>
<li>把脚本安装到：</li>
</ol>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">%ProgramData%\CalmOS</span></span></code></pre></div>
</div>
<ol start="7">
<li>检查安装目录权限</li>
<li>启动真正的：</li>
</ol>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">dev-config.ps1</span></span></code></pre></div>
</div>
<p>也就是说：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">网络上的 bootstrap.ps1
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">验证
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">下载整个项目
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">安装到 %ProgramData%\CalmOS
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">dev-config.ps1
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">真正开始配置电脑</span></span></code></pre></div>
</div>
<p>这样做还有一个好处：</p>
<p><strong>WSL 重启以后，脚本还存在。</strong></p>
<p>所以它不是运行一个临时 PowerShell，然后重启以后就找不到东西了。</p>
<hr>
<h2 id="四fullpartial-和-uninstall">四、Full、Partial 和 Uninstall</h2>
<p><code>dev-config.ps1</code> 支持三个 Action：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">-Action</span> <span class="n">Full</span>
</span></span><span class="line"><span class="cl"><span class="n">-Action</span> <span class="n">Partial</span>
</span></span><span class="line"><span class="cl"><span class="n">-Action</span> <span class="n">Uninstall</span></span></span></code></pre></div>
</div>
<h3 id="full">Full</h3>
<p>完整配置。</p>
<p>包括：</p>
<ul>
<li>软件</li>
<li>Windows 设置</li>
<li>Edge</li>
<li>Explorer</li>
<li>Terminal</li>
<li>PowerShell</li>
<li>Copilot</li>
<li>WSL</li>
<li>Ubuntu</li>
</ul>
<h3 id="partial">Partial</h3>
<p>可以理解成比较克制的标准配置。</p>
<p>它会跳过：</p>
<ul>
<li>Sudo</li>
<li>Developer Mode</li>
<li>Remote Desktop</li>
<li>Edge Policies</li>
<li>Explorer 推荐/云文件</li>
<li>全局通知关闭</li>
<li>Bluetooth 托盘图标</li>
<li>Web Search</li>
<li>Search Highlights</li>
<li>Widgets</li>
<li>WinUI Templates</li>
</ul>
<p>但仍然会安装 WinUI Copilot Plugin。(<a href="https://github.com/microsoft/WindowsDeveloperConfig/blob/main/windows-dev-config/README.md?utm_source=chatgpt.com" title="WindowsDeveloperConfig/windows-dev-config/README.md at main · microsoft/WindowsDeveloperConfig · GitHub" target="_blank" rel="noopener noreferrer">GitHub</a>
)</p>
<h3 id="uninstall">Uninstall</h3>
<p>这个就不是“恢复到你安装 Windows 时的状态”。</p>
<p>它会主动：</p>
<ul>
<li>删除 Ubuntu</li>
<li>卸载 WSL</li>
<li>删除安装的软件</li>
<li>重置它修改过的注册表设置</li>
<li>删除 Terminal 中它添加的配置</li>
<li>删除 Oh My Posh 配置</li>
<li>删除 WinUI 模板</li>
<li>删除 Copilot Plugin</li>
</ul>
<p>而且 Ubuntu 的删除是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-unregister</span> <span class="n">Ubuntu</span></span></span></code></pre></div>
</div>
<p>所以 Ubuntu 里面的数据也会被删除。(<a href="https://github.com/microsoft/WindowsDeveloperConfig/blob/main/windows-dev-config/README.md?utm_source=chatgpt.com" title="WindowsDeveloperConfig/windows-dev-config/README.md at main · microsoft/WindowsDeveloperConfig · GitHub" target="_blank" rel="noopener noreferrer">GitHub</a>
)</p>
<hr>
<h2 id="五packages它到底装了什么">五、Packages：它到底装了什么</h2>
<p>软件安装主要集中在：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/packages.ps1</span></span></code></pre></div>
</div>
<p>目前脚本中的主要软件包括：</p>
<table>
	<thead>
			<tr>
					<th>软件</th>
					<th>WinGet ID</th>
					<th>作用</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Windows Terminal</td>
					<td><code>Microsoft.WindowsTerminal</code></td>
					<td>终端</td>
			</tr>
			<tr>
					<td>Intelligent Terminal</td>
					<td><code>Microsoft.IntelligentTerminal</code></td>
					<td>Intelligent Terminal</td>
			</tr>
			<tr>
					<td>PowerShell 7</td>
					<td><code>Microsoft.PowerShell</code></td>
					<td>新版 PowerShell</td>
			</tr>
			<tr>
					<td>Git</td>
					<td><code>Git.Git</code></td>
					<td>Git</td>
			</tr>
			<tr>
					<td>GitHub CLI</td>
					<td><code>GitHub.cli</code></td>
					<td><code>gh</code></td>
			</tr>
			<tr>
					<td>Azure CLI</td>
					<td><code>Microsoft.AzureCLI</code></td>
					<td>Azure 命令行</td>
			</tr>
			<tr>
					<td>GitHub Copilot CLI</td>
					<td><code>GitHub.Copilot</code></td>
					<td>Copilot CLI</td>
			</tr>
			<tr>
					<td>VS Code</td>
					<td><code>Microsoft.VisualStudioCode</code></td>
					<td>编辑器</td>
			</tr>
			<tr>
					<td>.NET SDK 10</td>
					<td><code>Microsoft.DotNet.SDK.10</code></td>
					<td>.NET 开发</td>
			</tr>
			<tr>
					<td>Python 3.14</td>
					<td><code>Python.Python.3.14</code></td>
					<td>Python</td>
			</tr>
			<tr>
					<td>Visual C++ Redistributable</td>
					<td><code>Microsoft.VCRedist.2015+.*</code></td>
					<td>VC++ Runtime</td>
			</tr>
			<tr>
					<td>uv</td>
					<td><code>astral-sh.uv</code></td>
					<td>Python 包/环境管理</td>
			</tr>
			<tr>
					<td>Node.js LTS</td>
					<td><code>OpenJS.NodeJS.LTS</code></td>
					<td>Node.js</td>
			</tr>
			<tr>
					<td>nvm for Windows</td>
					<td><code>CoreyButler.NVMforWindows</code></td>
					<td>Node 版本管理</td>
			</tr>
			<tr>
					<td>Coreutils</td>
					<td><code>Microsoft.Coreutils</code></td>
					<td>Windows 下的 Unix 工具</td>
			</tr>
			<tr>
					<td>Oh My Posh</td>
					<td><code>JanDeDobbeleer.OhMyPosh</code></td>
					<td>PowerShell Prompt</td>
			</tr>
			<tr>
					<td>Windows App CLI</td>
					<td><code>Microsoft.WinAppCli</code></td>
					<td>Windows App 开发</td>
			</tr>
			<tr>
					<td>PowerToys</td>
					<td><code>Microsoft.PowerToys</code></td>
					<td>Windows 工具集</td>
			</tr>
	</tbody>
</table>
<p>这里有一点比较重要：</p>
<p>它不是简单判断“有没有安装”。</p>
<p>当前逻辑会判断软件是否已经是当前版本，如果 WinGet 认为有更新，也可能在重新运行时处理更新。</p>
<p>所以它更接近：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">确保开发环境达到目标状态</span></span></code></pre></div>
</div>
<p>而不是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">安装一次软件</span></span></code></pre></div>
</div>
<hr>
<h2 id="六系统设置">六、系统设置</h2>
<p>系统级设置在：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/registry-system.ps1</span></span></code></pre></div>
</div>
<p>目前 Full 模式主要包括：</p>
<h3 id="sudo">Sudo</h3>
<p>启用 Windows Sudo：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Sudo</span></span></code></pre></div>
</div>
<p>设置：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Enabled = 3</span></span></code></pre></div>
</div>
<p>也就是启用 inline 模式。</p>
<h3 id="developer-mode">Developer Mode</h3>
<p>启用：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Developer Mode</span></span></code></pre></div>
</div>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock</span></span></code></pre></div>
</div>
<h3 id="long-paths">Long Paths</h3>
<p>开启 Win32 长路径：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">LongPathsEnabled = 1</span></span></code></pre></div>
</div>
<p>这对于开发环境还是比较实用的。</p>
<p>尤其是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">node_modules</span></span></code></pre></div>
</div>
<p>或者一些层级比较深的项目目录。</p>
<h3 id="remote-desktop">Remote Desktop</h3>
<p>Full 模式还会把：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Remote Desktop</span></span></code></pre></div>
</div>
<p>打开。</p>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">fDenyTSConnections = 0</span></span></code></pre></div>
</div>
<p>脚本注释也特别说明了：<strong>RDP 防火墙规则还需要另外处理。</strong></p>
<p>Partial 模式只保留：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">LongPaths</span></span></code></pre></div>
</div>
<hr>
<h2 id="七文件资源管理器">七、文件资源管理器</h2>
<p>文件资源管理器对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/registry-explorer.ps1</span></span></code></pre></div>
</div>
<p>它做的事情比较符合程序员的使用习惯。</p>
<p>默认会：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">显示文件扩展名
</span></span><span class="line"><span class="cl">显示隐藏文件
</span></span><span class="line"><span class="cl">标题栏显示完整路径
</span></span><span class="line"><span class="cl">打开 Explorer 时进入“此电脑”
</span></span><span class="line"><span class="cl">关闭常用文件夹
</span></span><span class="line"><span class="cl">关闭最近文件
</span></span><span class="line"><span class="cl">关闭推荐/云文件
</span></span><span class="line"><span class="cl">关闭同步提供商提示
</span></span><span class="line"><span class="cl">配置 Details Pane</span></span></code></pre></div>
</div>
<p>例如：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HideFileExt = 0</span></span></code></pre></div>
</div>
<p>表示显示：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">main.kt</span></span></code></pre></div>
</div>
<p>而不是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">main</span></span></code></pre></div>
</div>
<p>隐藏文件也会打开。</p>
<p>另外，它还通过 Windows Shell API 处理部分 Explorer 显示状态，不完全依赖注册表。</p>
<hr>
<h2 id="八任务栏搜索和开始菜单">八、任务栏、搜索和开始菜单</h2>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/registry-taskbar-search.ps1</span></span></code></pre></div>
</div>
<p>主要包括：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">关闭通知
</span></span><span class="line"><span class="cl">隐藏 Bluetooth 托盘图标
</span></span><span class="line"><span class="cl">启用任务栏右键 End Task
</span></span><span class="line"><span class="cl">关闭开始菜单 / Search Web Search
</span></span><span class="line"><span class="cl">关闭 Search Highlights
</span></span><span class="line"><span class="cl">关闭 Start 推荐
</span></span><span class="line"><span class="cl">关闭 Start 账户通知
</span></span><span class="line"><span class="cl">关闭 Widgets</span></span></code></pre></div>
</div>
<p>例如：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">TaskbarEndTask = 1</span></span></code></pre></div>
</div>
<p>这样右键任务栏程序的时候可以直接看到：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">End task</span></span></code></pre></div>
</div>
<p>这对于开发时某些卡死程序比较方便。</p>
<p>Partial 模式只保留：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">EndTask
</span></span><span class="line"><span class="cl">StartRecommendations
</span></span><span class="line"><span class="cl">StartAccountNotifications</span></span></code></pre></div>
</div>
<p>其它项目会跳过。</p>
<hr>
<h2 id="九microsoft-edge">九、Microsoft Edge</h2>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/edge.ps1</span></span></code></pre></div>
</div>
<p>实际上只有两个设置：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">NewTabPageLocation = about:blank</span></span></code></pre></div>
</div>
<p>以及：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HideFirstRunExperience = 1</span></span></code></pre></div>
</div>
<p>也就是：</p>
<ul>
<li>新标签页使用空白页</li>
<li>不显示 Edge 第一次运行引导</li>
</ul>
<p>这部分只存在于 Full 配置，Partial 会直接跳过整个 Edge phase。</p>
<hr>
<h2 id="十字体">十、字体</h2>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/fonts.ps1</span></span></code></pre></div>
</div>
<p>这里不是直接调用 Windows 自带字体安装功能，而是从 Microsoft 的 Cascadia Code Release 下载：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">CascadiaCodeNF.ttf
</span></span><span class="line"><span class="cl">CascadiaMonoNF.ttf</span></span></code></pre></div>
</div>
<p>当前固定版本：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">2407.24</span></span></code></pre></div>
</div>
<p>并且脚本里写死了 SHA-256：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">E67A68EE3386DB63F48B9054BD196EA752BC6A4EBB4DF35ADCE6733DA50C8474</span></span></code></pre></div>
</div>
<p>下载完成之后会：</p>
<ol>
<li>校验 SHA-256</li>
<li>解压字体</li>
<li>放到 Windows Fonts</li>
<li>写入字体注册表</li>
<li>删除可能存在的旧用户字体副本</li>
</ol>
<p>最后把 Windows Terminal 默认字体设置成：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Cascadia Mono NF</span></span></code></pre></div>
</div>
<p>所以这一部分实际上是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">下载字体
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">校验文件
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">安装字体
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">注册字体
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">Terminal 使用 Cascadia Mono NF</span></span></code></pre></div>
</div>
<p>而不是简单地“下载一个 ttf”。</p>
<hr>
<h2 id="十一windows-terminal">十一、Windows Terminal</h2>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/terminal.ps1</span></span></code></pre></div>
</div>
<p>主要做两个事情。</p>
<h3 id="1-开启深色模式">1. 开启深色模式</h3>
<p>修改：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">AppsUseLightTheme = 0
</span></span><span class="line"><span class="cl">SystemUsesLightTheme = 0</span></span></code></pre></div>
</div>
<h3 id="2-powershell-7-设置为默认-terminal-profile">2. PowerShell 7 设置为默认 Terminal Profile</h3>
<p>它会读取：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">settings.json</span></span></code></pre></div>
</div>
<p>然后找到 PowerShell 7 Profile，把：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">defaultProfile</span></span></code></pre></div>
</div>
<p>指向 PowerShell 7。</p>
<p>这里项目还专门写了 Terminal 的公共处理代码，因为 <code>settings.json</code> 实际上比较复杂。</p>
<hr>
<h2 id="十二powershell-profile">十二、PowerShell Profile</h2>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/powershell-profile.ps1</span></span></code></pre></div>
</div>
<p>作用非常简单：</p>
<p><strong>给 PowerShell 7 加 Oh My Posh。</strong></p>
<p>它会找到：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$PROFILE</span></span></code></pre></div>
</div>
<p>然后加入：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">oh-my</span><span class="n">-posh</span> <span class="n">init</span> <span class="n">pwsh</span></span></span></code></pre></div>
</div>
<p>同时设置：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">InputEncoding = UTF-8
</span></span><span class="line"><span class="cl">OutputEncoding = UTF-8</span></span></code></pre></div>
</div>
<p>所以装完以后，PowerShell 7 的命令行提示符会使用 Oh My Posh，并且中文输入输出编码也会处理。</p>
<hr>
<h2 id="十三github-copilot">十三、GitHub Copilot</h2>
<p>对应：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/copilot.ps1</span></span></code></pre></div>
</div>
<p>这里实际上做了四件事情。</p>
<h3 id="1-windows-terminal-增加-copilot-profile">1. Windows Terminal 增加 Copilot Profile</h3>
<p>创建：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">%LOCALAPPDATA%\Microsoft\Windows Terminal\Fragments\DevConfig</span></span></code></pre></div>
</div>
<p>然后增加：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">GitHub Copilot</span></span></code></pre></div>
</div>
<p>Profile。</p>
<p>它实际执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">pwsh.exe -NoExit -Command &#34;copilot&#34;</span></span></code></pre></div>
</div>
<p>所以打开 Windows Terminal 后，Profile 下拉菜单里会多一个：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">GitHub Copilot</span></span></code></pre></div>
</div>
<h3 id="2-安装-winui-templates">2. 安装 WinUI Templates</h3>
<p>执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">dotnet new install Microsoft.WindowsAppSDK.WinUI.CSharp.Templates</span></span></code></pre></div>
</div>
<p>这样：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">dotnet new</span></span></code></pre></div>
</div>
<p>就可以使用对应的 WinUI 模板。</p>
<h3 id="3-添加微软的-copilot-skills-marketplace">3. 添加微软的 Copilot Skills Marketplace</h3>
<p>执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">copilot plugin marketplace add microsoft/win-dev-skills</span></span></code></pre></div>
</div>
<h3 id="4-安装-winui-plugin">4. 安装 WinUI Plugin</h3>
<p>执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">copilot plugin install winui@win-dev-skills</span></span></code></pre></div>
</div>
<p>这几个操作都是 <code>BestEffort</code>。</p>
<p>也就是说，即使 Copilot 网络访问失败，也不会因此把整个 Windows 开发环境安装流程直接终止。</p>
<hr>
<h2 id="十四wsl--ubuntu">十四、WSL + Ubuntu</h2>
<p>最后一个 phase：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/wsl.ps1</span></span></code></pre></div>
</div>
<p>故意放在最后。</p>
<p>原因很简单：</p>
<p><strong>WSL 安装可能要求 Windows 重启。</strong></p>
<p>如果把 WSL 放在前面，那么后面的软件和配置可能都要等重启之后才能继续。</p>
<p>所以项目的顺序是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">所有普通配置
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">最后安装 WSL
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">需要重启
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">恢复执行</span></span></code></pre></div>
</div>
<p>WSL 部分会：</p>
<h3 id="安装-wsl-platform">安装 WSL Platform</h3>
<p>首先尝试：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-install</span> <span class="p">-</span><span class="n">-no-distribution</span></span></span></code></pre></div>
</div>
<p>如果失败，则直接使用：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">VirtualMachinePlatform
</span></span><span class="line"><span class="cl">Microsoft-Windows-Subsystem-Linux</span></span></code></pre></div>
</div>
<p>两个 Windows Optional Features。</p>
<p>如果 WSL 版本比较旧，还会执行：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-update</span></span></span></code></pre></div>
</div>
<h3 id="安装-ubuntu">安装 Ubuntu</h3>
<p>默认发行版：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Ubuntu</span></span></code></pre></div>
</div>
<p>安装：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-install</span> <span class="n">-d</span> <span class="n">Ubuntu</span> <span class="p">-</span><span class="n">-no-launch</span></span></span></code></pre></div>
</div>
<p>如果 Microsoft Store 路径失败，则尝试：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">powershell</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-install</span> <span class="n">-d</span> <span class="n">Ubuntu</span> <span class="p">-</span><span class="n">-no-launch</span> <span class="p">-</span><span class="n">-web-download</span></span></span></code></pre></div>
</div>
<p>而且不会自动启动 Ubuntu。</p>
<p>所以最后你还需要自己打开一次 Ubuntu，创建 Linux 用户名和密码。</p>
<hr>
<h2 id="十五为什么重启以后还能继续">十五、为什么重启以后还能继续？</h2>
<p>这是这个项目里我觉得比较有意思的一部分。</p>
<p>它会创建：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">WindowsDevConfigResume</span></span></code></pre></div>
</div>
<p>Scheduled Task。</p>
<p>重启之前，把进度保存到：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">devconfig-tally.json</span></span></code></pre></div>
</div>
<p>然后：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">注册登录任务
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">保存当前进度
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">10 秒倒计时
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">shutdown /r
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">Windows 重启
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">用户重新登录
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">Scheduled Task 启动
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">再次请求 UAC
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">继续执行</span></span></code></pre></div>
</div>
<p>而不是重新从头执行。</p>
<p><code>_reboot-resume.ps1</code> 负责的就是这套机制。</p>
<hr>
<h2 id="十六为什么它敢直接从-github-下载-powershell">十六、为什么它敢直接从 GitHub 下载 PowerShell？</h2>
<p>因为还有一层：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">steps/_security.ps1</span></span></code></pre></div>
</div>
<p>这个脚本会检查：</p>
<ul>
<li>文件是不是安全目录</li>
<li>有没有 Junction / Symbolic Link</li>
<li>目录是不是 Administrator/SYSTEM 所有</li>
<li>普通用户能不能修改安装文件</li>
<li><code>.ps1</code> 是否具有 Microsoft Corporation 的 Authenticode 签名</li>
</ul>
<p>生产模式下，如果签名不对，会直接停止。</p>
<p>所以整个流程不是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">curl | powershell</span></span></code></pre></div>
</div>
<p>然后下载什么就执行什么。</p>
<p>实际上是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">下载
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">验证
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">检查目录权限
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">检查 Microsoft 签名
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">安装到受保护目录
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">再次验证
</span></span><span class="line"><span class="cl"> ↓
</span></span><span class="line"><span class="cl">执行</span></span></code></pre></div>
</div>
<p>这也是为什么官方特别强调：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">- AllowUnsigned</span></span></code></pre></div>
</div>
<p>只应该用于开发/测试。</p>
<hr>
<h2 id="十七整个项目最核心的几个脚本">十七、整个项目最核心的几个脚本</h2>
<p>如果不看细节，其实可以把整个项目理解成：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">bootstrap.ps1
</span></span><span class="line"><span class="cl">    │
</span></span><span class="line"><span class="cl">    │ 负责下载、签名、安全目录、UAC
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">dev-config.ps1
</span></span><span class="line"><span class="cl">    │
</span></span><span class="line"><span class="cl">    │ 负责调度
</span></span><span class="line"><span class="cl">    │
</span></span><span class="line"><span class="cl">    ├── prerequisites.ps1
</span></span><span class="line"><span class="cl">    ├── packages.ps1
</span></span><span class="line"><span class="cl">    ├── registry-system.ps1
</span></span><span class="line"><span class="cl">    ├── registry-explorer.ps1
</span></span><span class="line"><span class="cl">    ├── registry-taskbar-search.ps1
</span></span><span class="line"><span class="cl">    ├── edge.ps1
</span></span><span class="line"><span class="cl">    ├── fonts.ps1
</span></span><span class="line"><span class="cl">    ├── terminal.ps1
</span></span><span class="line"><span class="cl">    ├── powershell-profile.ps1
</span></span><span class="line"><span class="cl">    ├── copilot.ps1
</span></span><span class="line"><span class="cl">    └── wsl.ps1
</span></span><span class="line"><span class="cl">             │
</span></span><span class="line"><span class="cl">             ↓
</span></span><span class="line"><span class="cl">       _*.ps1 公共函数</span></span></code></pre></div>
</div>
<p>所以真正的核心不是某一个安装命令。</p>
<p>而是：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">bootstrap
</span></span><span class="line"><span class="cl">+
</span></span><span class="line"><span class="cl">orchestrator
</span></span><span class="line"><span class="cl">+
</span></span><span class="line"><span class="cl">phase
</span></span><span class="line"><span class="cl">+
</span></span><span class="line"><span class="cl">step runner
</span></span><span class="line"><span class="cl">+
</span></span><span class="line"><span class="cl">helper</span></span></code></pre></div>
</div>
<p>这也是这个项目比较适合拿来研究的地方。</p>
<hr>
<h2 id="十八最后每一个脚本到底有什么区别">十八、最后：每一个脚本到底有什么区别</h2>
<p>这一部分直接列出来，方便以后自己看源码。</p>
<h3 id="根目录脚本">根目录脚本</h3>
<table>
	<thead>
			<tr>
					<th>脚本</th>
					<th>作用</th>
					<th>实际操作</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>bootstrap.ps1</code></td>
					<td>远程入口</td>
					<td>下载项目、UAC、签名验证、创建安全安装目录、启动 <code>dev-config.ps1</code></td>
			</tr>
			<tr>
					<td><code>setup-full.ps1</code></td>
					<td>Full 快捷入口</td>
					<td>验证 Bootstrap，然后以 <code>Full</code> 模式启动</td>
			</tr>
			<tr>
					<td><code>setup-standard.ps1</code></td>
					<td>Partial 快捷入口</td>
					<td>验证 Bootstrap，然后以 <code>Partial</code> 模式启动</td>
			</tr>
			<tr>
					<td><code>uninstall.ps1</code></td>
					<td>卸载入口</td>
					<td>验证 Bootstrap，然后以 <code>Uninstall</code> 模式启动</td>
			</tr>
			<tr>
					<td><code>dev-config.ps1</code></td>
					<td>总调度器</td>
					<td>加载所有 phase、控制执行顺序、日志、锁、重启恢复、最终汇总</td>
			</tr>
	</tbody>
</table>
<p><code>bootstrap.ps1</code> 是真正的安装入口，而三个 <code>setup-*.ps1</code> 基本只是固定 Action 的安全包装器；真正干活的是 <code>dev-config.ps1</code>。</p>
<hr>
<h3 id="steps-里的实际配置脚本"><code>steps/</code> 里的实际配置脚本</h3>
<table>
	<thead>
			<tr>
					<th>脚本</th>
					<th>主要操作</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>prerequisites.ps1</code></td>
					<td>安装/确认 PowerShell 7，准备 WinGet</td>
			</tr>
			<tr>
					<td><code>packages.ps1</code></td>
					<td>使用 WinGet 安装/卸载开发软件</td>
			</tr>
			<tr>
					<td><code>registry-system.ps1</code></td>
					<td>Sudo、Developer Mode、Long Paths、Remote Desktop</td>
			</tr>
			<tr>
					<td><code>registry-explorer.ps1</code></td>
					<td>文件扩展名、隐藏文件、完整路径、Explorer 首页、最近/常用文件等</td>
			</tr>
			<tr>
					<td><code>registry-taskbar-search.ps1</code></td>
					<td>通知、Bluetooth 图标、End Task、搜索、Start 推荐、Widgets</td>
			</tr>
			<tr>
					<td><code>edge.ps1</code></td>
					<td>Edge 空白新标签页、关闭首次运行体验</td>
			</tr>
			<tr>
					<td><code>fonts.ps1</code></td>
					<td>下载并安装 Cascadia Code Nerd Fonts，配置 Terminal 字体</td>
			</tr>
			<tr>
					<td><code>terminal.ps1</code></td>
					<td>深色主题、PowerShell 7 默认 Profile</td>
			</tr>
			<tr>
					<td><code>powershell-profile.ps1</code></td>
					<td>PowerShell 7 加入 Oh My Posh</td>
			</tr>
			<tr>
					<td><code>copilot.ps1</code></td>
					<td>Copilot Terminal Profile、WinUI 模板、win-dev-skills Marketplace、WinUI Plugin</td>
			</tr>
			<tr>
					<td><code>wsl.ps1</code></td>
					<td>WSL、VirtualMachinePlatform、Ubuntu、重启恢复，以及卸载</td>
			</tr>
	</tbody>
</table>
<p>这些文件基本都是“一文件对应一个配置阶段”，<code>dev-config.ps1</code> 会按照固定顺序执行它们。</p>
<hr>
<h3 id="steps_ps1-公共辅助脚本"><code>steps/_*.ps1</code> 公共辅助脚本</h3>
<p>这些文件<strong>不是独立的配置阶段</strong>，而是给上面的脚本提供公共函数。</p>
<table>
	<thead>
			<tr>
					<th>脚本</th>
					<th>负责什么</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>_security.ps1</code></td>
					<td>Microsoft 签名验证、目录权限检查、阻止不安全目录/Junction</td>
			</tr>
			<tr>
					<td><code>_step-runner.ps1</code></td>
					<td><code>Check → Apply → Verify</code> 核心执行框架、统计成功/跳过/失败</td>
			</tr>
			<tr>
					<td><code>_elevation.ps1</code></td>
					<td>管理员权限、UAC、单实例锁、非管理员任务执行</td>
			</tr>
			<tr>
					<td><code>_reboot-resume.ps1</code></td>
					<td>注册重启恢复任务、保存进度、重启 Windows</td>
			</tr>
			<tr>
					<td><code>_registry.ps1</code></td>
					<td>注册表读取、写入、Reset</td>
			</tr>
			<tr>
					<td><code>_environment.ps1</code></td>
					<td>PATH 刷新、TLS、进程执行、超时、UTF-8 文件读写</td>
			</tr>
			<tr>
					<td><code>_retry.ps1</code></td>
					<td>网络/安装操作失败后的重试和指数退避</td>
			</tr>
			<tr>
					<td><code>_terminal.ps1</code></td>
					<td>Windows Terminal <code>settings.json</code> 的读取、修改、备份</td>
			</tr>
			<tr>
					<td><code>_winget.ps1</code></td>
					<td>WinGet 模块/CLI、软件查询、安装、卸载、更新</td>
			</tr>
			<tr>
					<td><code>_console.ps1</code></td>
					<td>日志、Transcript、结束时等待按键</td>
			</tr>
			<tr>
					<td><code>_pwsh-bootstrap.ps1</code></td>
					<td>在 Windows PowerShell 5.1 下安装并切换到 PowerShell 7</td>
			</tr>
	</tbody>
</table>
<p>这些辅助脚本共同解决的是“怎么可靠地执行配置”，而不是“配置什么”。</p>
<hr>
<h2 id="十九如果只记住一句话">十九、如果只记住一句话</h2>
<p><code>WindowsDeveloperConfig</code> 可以简单理解成：</p>
<div class="code-block">
  <div class="code-block-header">
    <span class="code-block-lang">text</span>
    <button type="button" class="code-copy" aria-label="Copy code">
      <span class="code-copy-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</span>
      <span class="code-copy-icon code-copy-icon-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
</span>
      <span class="code-copy-label">Copy</span>
    </button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">bootstrap.ps1
</span></span><span class="line"><span class="cl">    = 下载和安全启动
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">dev-config.ps1
</span></span><span class="line"><span class="cl">    = 总调度
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">steps/*.ps1
</span></span><span class="line"><span class="cl">    = 每一类具体配置
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">steps/_*.ps1
</span></span><span class="line"><span class="cl">    = 所有配置共用的基础设施
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">step-runner
</span></span><span class="line"><span class="cl">    = 检查 → 修改 → 再检查
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">reboot-resume
</span></span><span class="line"><span class="cl">    = 重启以后接着干</span></span></code></pre></div>
</div>
<p>它真正有价值的地方，其实不在于“帮你安装了 VS Code、Git、Python”。</p>
<p>这些事情自己执行几个 <code>winget install</code> 也能做到。</p>
<p>比较值得借鉴的是它把一个 Windows 初始化脚本做成了一个<strong>可以重复执行、可以验证结果、可以失败重试、可以跨重启恢复、还有签名和权限保护的配置系统</strong>。</p>
<p>对于经常重装 Windows、需要维护多台开发机，或者自己想写一套 Windows 初始化脚本的人，这个项目的结构比单纯复制几条 <code>winget install</code> 命令更值得参考。微软官方仓库目前也明确把它定位为面向 Windows 开发机的可重复、经过 CI 测试的自动化配置方案。(<a href="https://github.com/microsoft/WindowsDeveloperConfig/?utm_source=chatgpt.com" title="GitHub - microsoft/WindowsDeveloperConfig: Automate the setup and configuration of your Windows development environment. · GitHub" target="_blank" rel="noopener noreferrer">GitHub</a>
)</p>
<p><strong>项目地址：</strong> <a href="https://github.com/microsoft/WindowsDeveloperConfig?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer">Microsoft / WindowsDeveloperConfig</a>
</p>
]]></content:encoded></item></channel></rss>