<?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>Windows on Just Do It</title>
    <link>https://blog.heartleo.dev/tags/windows/</link>
    <description>Recent content in Windows on Just Do It</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 22 Jul 2026 19:00:00 +0800</lastBuildDate>
    <atom:link href="https://blog.heartleo.dev/tags/windows/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>把 Claude Code 的配置目录从 C 盘迁到 D 盘</title>
      <link>https://blog.heartleo.dev/posts/migrate-claude-code-config-directory/</link>
      <pubDate>Wed, 22 Jul 2026 19:00:00 +0800</pubDate>
      <guid>https://blog.heartleo.dev/posts/migrate-claude-code-config-directory/</guid>
      <description>CLAUDE_CONFIG_DIR 一个变量指过去，只是第一步。8.6 GB 的体量、藏在目录外面的 .claude.json、插件元数据里写死的绝对路径，三个地方都得处理，插件才会重新加载出来。</description>
      <content:encoded><![CDATA[<p><a href="/posts/migrate-codex-home-directory/">上一篇</a>挪 Codex，改个 <code>CODEX_HOME</code> 就完事了。Claude Code 我以为是同一件事重做一遍，结果多花了一个多小时——环境变量设完，插件一个都没加载出来。</p>
<p>下面是完整的六步，按顺序做。第三步是上一篇没有的坑，跳过它插件必然失效。</p>
<h2 id="先看清楚目录里有什么">先看清楚目录里有什么</h2>
<p><code>.claude</code> 里这几样必须保住：</p>
<ul>
<li><code>projects/</code> — 所有对话历史，按项目路径分目录存 <code>.jsonl</code></li>
<li><code>plugins/</code> — 插件本体、缓存和元数据</li>
<li><code>skills/</code> — 技能</li>
<li><code>settings.json</code> — 全局设置，含插件启用列表</li>
<li><code>.credentials.json</code> — 登录凭据</li>
</ul>
<p>还有一个不在这个目录里：<code>~/.claude.json</code>。它躺在用户主目录根下，跟 <code>.claude</code> 平级，存项目索引和 MCP 服务器配置，我这边 150 KB。</p>
<p>我这份 <code>.claude</code> 有 8.6 GB、7 万多个文件，大头全在 <code>plugins/cache</code>。装了三十多个插件，每个是一次 git clone，缓存就这么堆起来的。</p>
<h2 id="第一步复制目录">第一步：复制目录</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">robocopy</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\.claude&#34;</span> <span class="s2">&#34;D:\Claude\.claude&#34;</span> <span class="p">/</span><span class="n">E</span> <span class="p">/</span><span class="n">COPY</span><span class="err">:</span><span class="n">DAT</span> <span class="p">/</span><span class="n">R:</span><span class="mf">1</span> <span class="p">/</span><span class="n">W:</span><span class="mf">1</span> <span class="p">/</span><span class="n">XJ</span>
</span></span></code></pre></div><p><code>/XJ</code> 跳过 junction 和符号链接。<code>plugins/cache</code> 底下会有指向别处的链接，不跳过 robocopy 有概率顺着爬出去，甚至绕回来死循环。</p>
<p><code>/COPY:DAT</code> 而不是上一篇用的 <code>/COPYALL</code>。<code>/COPYALL</code> 要连 ACL 和审计信息一起复制，非管理员身份跑会大面积报权限错误。数据、属性、时间戳三样够用。</p>
<p>跑了 3 分 59 秒，71166 个文件，退出码 9。</p>
<p>退出码 9 看着像失败，其实是位标志相加：1 表示有文件被复制，8 表示有文件没复制成功。真正失败的是两个：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ERROR 2 (0x00000002) Accessing Destination Directory
</span></span><span class="line"><span class="cl">  ...\plugins\cache\temp_git_1784715795236_nimcz8\
</span></span><span class="line"><span class="cl">ERROR 2 (0x00000002) Copying File
</span></span><span class="line"><span class="cl">  ...\telemetry\1p_failed_events.&lt;session-id&gt;.json
</span></span></code></pre></div><p>一个是 git clone 留下的临时目录，一个是当前会话正在写的 telemetry 文件，都是运行时垃圾，边复制边消失。robocopy 退出码小于 8 就是干净成功，等于 8 或 9 要看一眼错误行是什么，别看见非零就重跑。</p>
<h2 id="第二步补上目录外面的那个文件">第二步：补上目录外面的那个文件</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Copy-Item</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\.claude.json&#34;</span> <span class="s2">&#34;D:\Claude\.claude\.claude.json&#34;</span> <span class="n">-Force</span>
</span></span></code></pre></div><p>只 copy <code>.claude</code> 会漏掉它。设了 <code>CLAUDE_CONFIG_DIR</code> 之后，Claude Code 会去配置目录里找 <code>.claude.json</code>，找不到就当成全新安装，项目索引和 MCP 配置全丢。</p>
<h2 id="第三步改掉插件元数据里的绝对路径">第三步：改掉插件元数据里的绝对路径</h2>
<p>这一步是整件事的关键。<code>plugins/</code> 下有两个 JSON 文件，里面存的是<strong>绝对路径</strong>：</p>
<p><code>installed_plugins.json</code>，每个插件一条：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;superpowers@claude-plugins-official&#34;</span><span class="err">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;scope&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;installPath&#34;</span><span class="p">:</span> <span class="s2">&#34;C:\\Users\\&lt;user&gt;\\.claude\\plugins\\cache\\claude-plugins-official\\superpowers\\6.1.1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;version&#34;</span><span class="p">:</span> <span class="s2">&#34;6.1.1&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span></code></pre></div><p><code>known_marketplaces.json</code>，每个市场一条：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;claude-plugins-official&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;source&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;source&#34;</span><span class="p">:</span> <span class="s2">&#34;github&#34;</span><span class="p">,</span> <span class="nt">&#34;repo&#34;</span><span class="p">:</span> <span class="s2">&#34;anthropics/claude-plugins-official&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;installLocation&#34;</span><span class="p">:</span> <span class="s2">&#34;C:\\Users\\&lt;user&gt;\\.claude\\plugins\\marketplaces\\claude-plugins-official&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>robocopy 只搬文件，不改内容。文件到了 D 盘，路径还写着 C 盘。我这边表现是：<code>/plugin</code> 列表里空空如也，skills 只剩内置的那几个，<code>settings.json</code> 里 <code>enabledPlugins</code> 三十多条一条没生效。因为源目录我留着没删，路径本身不算失效，所以也没有任何报错。</p>
<p>批量改写，先备份：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$base</span> <span class="p">=</span> <span class="s2">&#34;D:\Claude\.claude\plugins&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Copy-Item</span> <span class="s2">&#34;</span><span class="nv">$base</span><span class="s2">\installed_plugins.json&#34;</span> <span class="s2">&#34;</span><span class="nv">$base</span><span class="s2">\installed_plugins.json.bak&#34;</span> <span class="n">-Force</span>
</span></span><span class="line"><span class="cl"><span class="nb">Copy-Item</span> <span class="s2">&#34;</span><span class="nv">$base</span><span class="s2">\known_marketplaces.json&#34;</span> <span class="s2">&#34;</span><span class="nv">$base</span><span class="s2">\known_marketplaces.json.bak&#34;</span> <span class="n">-Force</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$f</span> <span class="k">in</span> <span class="vm">@</span><span class="p">(</span><span class="s2">&#34;</span><span class="nv">$base</span><span class="s2">\installed_plugins.json&#34;</span><span class="p">,</span> <span class="s2">&#34;</span><span class="nv">$base</span><span class="s2">\known_marketplaces.json&#34;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$s</span> <span class="p">=</span> <span class="nb">Get-Content</span> <span class="nv">$f</span> <span class="n">-Raw</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$s</span> <span class="p">=</span> <span class="nv">$s</span><span class="p">.</span><span class="py">Replace</span><span class="p">(</span><span class="s1">&#39;C:\\Users\\&lt;user&gt;\\.claude&#39;</span><span class="p">,</span> <span class="s1">&#39;D:\\Claude\\.claude&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="no">IO.File</span><span class="p">]::</span><span class="n">WriteAllText</span><span class="p">(</span><span class="nv">$f</span><span class="p">,</span> <span class="nv">$s</span><span class="p">,</span> <span class="p">(</span><span class="nb">New-Object</span> <span class="n">Text</span><span class="p">.</span><span class="py">UTF8Encoding</span> <span class="vm">$false</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>两个细节。JSON 里的反斜杠是转义过的，所以匹配串要写双反斜杠。写回用 <code>WriteAllText</code> 配无 BOM 的 <code>UTF8Encoding</code>，别用 <code>Set-Content</code>——它默认按系统 ANSI 编码写，中文路径会变乱码。</p>
<p>改完确认一遍每条路径都能落地：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$j</span> <span class="p">=</span> <span class="nb">Get-Content</span> <span class="s2">&#34;D:\Claude\.claude\plugins\installed_plugins.json&#34;</span> <span class="n">-Raw</span> <span class="p">|</span> <span class="nb">ConvertFrom-Json</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$p</span> <span class="k">in</span> <span class="nv">$j</span><span class="p">.</span><span class="py">plugins</span><span class="p">.</span><span class="py">PSObject</span><span class="p">.</span><span class="n">Properties</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="o">-not</span> <span class="p">(</span><span class="nb">Test-Path</span> <span class="nv">$p</span><span class="p">.</span><span class="n">Value</span><span class="p">[</span><span class="mf">0</span><span class="p">].</span><span class="n">installPath</span><span class="p">))</span> <span class="p">{</span> <span class="s2">&#34;MISSING: </span><span class="p">$(</span><span class="nv">$p</span><span class="p">.</span><span class="n">Name</span><span class="p">)</span><span class="s2">&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>没有输出就是全通。</p>
<p><code>~/.claude.json</code> 里可能也有一条 <code>C:/Users/&lt;user&gt;/.claude</code>，注意看它在哪个字段。我那条在 <code>projects</code> 下，是「这个目录被当项目打开过」的索引记录，不是插件路径，别顺手改掉。</p>
<h2 id="第四步设环境变量">第四步：设环境变量</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="p">[</span><span class="no">Environment</span><span class="p">]::</span><span class="n">SetEnvironmentVariable</span><span class="p">(</span><span class="s2">&#34;CLAUDE_CONFIG_DIR&#34;</span><span class="p">,</span> <span class="s2">&#34;D:\Claude\.claude&#34;</span><span class="p">,</span> <span class="s2">&#34;User&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>Machine 级不用设。环境变量解析是 User 覆盖 Machine，你自己的终端永远读 User 那份。机器级只在「这台机器上别的 Windows 账户也要用同一份配置」时才有意义，而那意味着共用同一份 <code>projects/</code> 和同一份凭据，多数情况下不是你想要的。</p>
<p>真要设也别指望在 Claude Code 里让它代跑。写机器级变量要动 <code>HKLM</code>，需要管理员权限，而 Claude Code 开的是非交互会话，UAC 弹窗弹不出来。我试了两次 <code>Start-Process -Verb RunAs</code>，命令返回正常，回头查注册表是空的——静默失败，没有报错。要设就手动开个管理员 PowerShell。</p>
<h2 id="第五步重启然后更新插件">第五步：重启，然后更新插件</h2>
<p>改完开新终端，旧终端读的还是老值。</p>
<p>新终端里先确认 CLI 能正常枚举：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">claude</span> <span class="n">plugin</span> <span class="n">list</span>
</span></span></code></pre></div><p>能列出插件、状态显示 enabled，说明第三步的路径改对了。</p>
<p>接着把市场和插件都刷一遍。市场元数据里的 commit SHA 是迁移前的，不更新的话下次自动检查更新可能对不上：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">claude</span> <span class="n">plugin</span> <span class="n">marketplace</span> <span class="n">update</span>
</span></span></code></pre></div><p>然后逐个更新插件。<code>claude plugin update</code> 一次只吃一个插件名，三十多个手敲不现实，从 <code>installed_plugins.json</code> 里读出来循环：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$j</span> <span class="p">=</span> <span class="nb">Get-Content</span> <span class="s2">&#34;D:\Claude\.claude\plugins\installed_plugins.json&#34;</span> <span class="n">-Raw</span> <span class="p">|</span> <span class="nb">ConvertFrom-Json</span>
</span></span><span class="line"><span class="cl"><span class="nv">$fail</span> <span class="p">=</span> <span class="vm">@</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$n</span> <span class="k">in</span> <span class="nv">$j</span><span class="p">.</span><span class="py">plugins</span><span class="p">.</span><span class="py">PSObject</span><span class="p">.</span><span class="py">Properties</span><span class="p">.</span><span class="n">Name</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">claude</span> <span class="n">plugin</span> <span class="n">update</span> <span class="nv">$n</span> <span class="p">|</span> <span class="nb">Out-Null</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nv">$LASTEXITCODE</span> <span class="o">-ne</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span> <span class="nv">$fail</span> <span class="p">+=</span> <span class="nv">$n</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;failed: </span><span class="p">$(</span><span class="nv">$fail</span><span class="p">.</span><span class="n">Count</span><span class="p">)</span><span class="s2">&#34;</span><span class="p">;</span> <span class="nv">$fail</span>
</span></span></code></pre></div><p>我这边 9 个市场、38 个插件，全部成功。跑完还得再重启一次，<code>plugin update</code> 的结果下次启动才应用。</p>
<h2 id="第六步验证">第六步：验证</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Test-Path</span> <span class="s2">&#34;D:\Claude\.claude\.credentials.json&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">Get-ChildItem</span> <span class="s2">&#34;D:\Claude\.claude\projects&#34;</span><span class="p">).</span><span class="py">Count</span>
</span></span></code></pre></div><p>我这边 <code>projects</code> 下 32 个目录。进 Claude Code 跑一次 <code>/resume</code>，历史对话能翻出来；<code>/plugin</code> 里插件都在，状态 enabled；<code>/skills</code> 能看到插件带的技能。三样都对就算成了。</p>
<p>源目录先别删，确认几天再清理。C 盘也不差这几天。</p>
<h2 id="顺手翻了一下别的环境变量">顺手翻了一下别的环境变量</h2>
<p>既然在折腾配置，把 Claude Code 认哪些环境变量都摸了一遍。<a href="https://code.claude.com/docs/en/env-vars">官方文档</a>有完整列表，但页面很长，抓取容易被截断。</p>
<p>更直接的办法是从本机装的二进制里扒。Claude Code 现在发的是打包好的原生二进制，JS 源码带字符串留在里面：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$p</span> <span class="p">=</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\.local\share\claude\versions\2.1.217&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$s</span> <span class="p">=</span> <span class="p">[</span><span class="no">Text.Encoding</span><span class="p">]::</span><span class="n">GetEncoding</span><span class="p">(</span><span class="s1">&#39;latin1&#39;</span><span class="p">).</span><span class="py">GetString</span><span class="p">([</span><span class="no">IO.File</span><span class="p">]::</span><span class="n">ReadAllBytes</span><span class="p">(</span><span class="nv">$p</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="no">regex</span><span class="p">]::</span><span class="n">Matches</span><span class="p">(</span><span class="nv">$s</span><span class="p">,</span> <span class="s1">&#39;process\.env\.([A-Z][A-Z0-9_]{3,})&#39;</span><span class="p">)</span> <span class="p">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">ForEach-Object</span> <span class="p">{</span> <span class="nv">$_</span><span class="p">.</span><span class="n">Groups</span><span class="p">[</span><span class="mf">1</span><span class="p">].</span><span class="py">Value</span> <span class="p">}</span> <span class="p">|</span> <span class="nb">Sort-Object</span> <span class="n">-Unique</span>
</span></span></code></pre></div><p>v2.1.217 里扒出 522 个。绝大多数是内部开关和 CI 检测用的，别乱设。跟配置真正相关的几类：</p>
<p>路径类跟这次迁移同族。<code>CLAUDE_CODE_PLUGIN_CACHE_DIR</code> 可以单独把插件缓存挪走——我那 8.6 GB 的大头就在这儿，早知道只挪这一个就够了，还不用碰上面第三步。另外有 <code>CLAUDE_TMPDIR</code> 和 <code>CLAUDE_CODE_DEBUG_LOGS_DIR</code>，后者名字里带 DIR 但实际要填文件路径。</p>
<p>超时类常用的是 <code>API_TIMEOUT_MS</code>（默认 10 分钟）和 <code>BASH_DEFAULT_TIMEOUT_MS</code>（默认 2 分钟）。网络不好或者走中转的时候会用上。</p>
<p>关开关的一堆 <code>DISABLE_*</code> 里，<code>CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC</code> 最省事，一把关掉所有非必要请求，比一个个关干净。</p>
<p>除了 <code>CLAUDE_CONFIG_DIR</code>，上面这些更适合写进 <code>settings.json</code> 的 <code>env</code> 块，跟着项目或用户走，不用污染整机环境。<code>CLAUDE_CONFIG_DIR</code> 是唯一的例外，因为它得在读 <code>settings.json</code> 之前就生效，只能走环境变量。</p>
]]></content:encoded>
    </item>
    <item>
      <title>把 Codex 主目录从 C 盘迁到 D 盘</title>
      <link>https://blog.heartleo.dev/posts/migrate-codex-home-directory/</link>
      <pubDate>Wed, 22 Jul 2026 15:00:00 +0800</pubDate>
      <guid>https://blog.heartleo.dev/posts/migrate-codex-home-directory/</guid>
      <description>C 盘快满，Codex CLI 的主目录（缓存、会话记录、鉴权信息）也占了不小一块。用 CODEX_HOME 环境变量把它整体挪到 D 盘，顺带为跨设备统一配置铺路，全程没遇到大坑。</description>
      <content:encoded><![CDATA[<p>C 盘快满，翻了一下才发现 <code>.codex</code> 目录攒了不少东西：缓存、会话记录、插件、鉴权信息。挪到 D 盘，顺便为以后跨设备同步配置留个口子。</p>
<h2 id="为什么不用-symlink">为什么不用 symlink</h2>
<p>Codex CLI 的主目录路径由 <code>CODEX_HOME</code> 环境变量控制，读取顺序在启动时定死。改环境变量比建 symlink 更直接：不用管文件系统链接的权限问题，卸载重装时也不会因为符号链接失效导致路径解析出错。</p>
<h2 id="步骤">步骤</h2>
<ol>
<li>
<p>找到旧目录：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$env:USERPROFILE</span><span class="p">\.</span><span class="py">codex</span>
</span></span></code></pre></div></li>
<li>
<p>把内容整体搬到新位置：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">robocopy</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\.codex&#34;</span> <span class="s2">&#34;D:\Codex\.codex&#34;</span> <span class="p">/</span><span class="n">E</span> <span class="p">/</span><span class="n">COPYALL</span>
</span></span></code></pre></div></li>
<li>
<p>设置 <code>CODEX_HOME</code> 环境变量，User 和 Machine 两级都写，避免某些以系统身份启动的终端或计划任务只读 Machine 级变量而读不到：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="p">[</span><span class="no">System.Environment</span><span class="p">]::</span><span class="n">SetEnvironmentVariable</span><span class="p">(</span><span class="s2">&#34;CODEX_HOME&#34;</span><span class="p">,</span> <span class="s2">&#34;D:\Codex\.codex&#34;</span><span class="p">,</span> <span class="s2">&#34;User&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="no">System.Environment</span><span class="p">]::</span><span class="n">SetEnvironmentVariable</span><span class="p">(</span><span class="s2">&#34;CODEX_HOME&#34;</span><span class="p">,</span> <span class="s2">&#34;D:\Codex\.codex&#34;</span><span class="p">,</span> <span class="s2">&#34;Machine&#34;</span><span class="p">)</span>
</span></span></code></pre></div></li>
<li>
<p>重开一个终端（环境变量改了对已打开的终端不生效），验证：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$env:CODEX_HOME</span>
</span></span><span class="line"><span class="cl"><span class="n">codex</span> <span class="p">-</span><span class="n">-version</span>
</span></span></code></pre></div><p>确认 <code>auth.json</code> 还在新目录下，登录状态没丢，跑一次命令确认会话记录写到了新路径。</p>
</li>
<li>
<p>确认无误后删掉旧目录 <code>C:\Users\&lt;user&gt;\.codex</code>。</p>
</li>
</ol>
<h2 id="结果">结果</h2>
<p>全程没踩大坑。唯一容易忘的是第 4 步：改完环境变量得开新终端再验证，不然会误以为没生效，回头折腾半天查错。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
