万年历 购物 网址 日历 小说 | 三峰软件 天天财富 小游戏 视频推荐 小游戏
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页  日历2025  日历2026  日历2027  日历知识  | 每日头条  视频推荐  数码知识 两性话题 情感天地 心理咨询 旅游天地 | 明星娱乐 电视剧  职场天地  体育  娱乐 
日历软件  煮酒论史  历史 中国历史 世界历史 春秋战国 三国 唐朝 宋朝 明朝 清朝 哲学 厚黑学 心理学 | 文库大全  文库分类 
电影票房 娱乐圈 娱乐 弱智 火研 中华城市 仙家 六爻 佛门 风水 钓鱼 双色球 戒色 航空母舰 网球 乒乓球 足球 nba 象棋 体操
商业财经知识 科技 汽车知识 工程技术知识 时尚与穿搭 家居与生活 设计艺术知识
    
  知识库 -> 数码 -> codex的windows桌面版真的只有在wsl中才是“满血”,才有最佳体验吗? -> 正文阅读

[数码]codex的windows桌面版真的只有在wsl中才是“满血”,才有最佳体验吗?

[收藏本文] 【下载本文】
如题,在L站看见一个帖子,标题是:Windows Codex App 满血!!使用指南(扫盲) 帖子里说: >官方文档里,目前明确把“Windows …
前言
最近在 Windows 上使用 Codex 做本地开发时,经常遇到一些很烦的问题:
中文路径或中文输出异常命令里有引号、JSON、正则时容易解析失败一些 PowerShell 7 支持的语法在 PowerShell 5.1 里不可用明明命令本身没问题,但 Codex 调用时表现不稳定
导致codex任务效率很低且白白浪费token。
排查后发现,Codex 本地 shell 命令默认进入的是系统自带的 Windows PowerShell 5.1:

Get-Process -Id $PID | Select-Object Id,ProcessName,Path
$PSVersionTable.PSVersion

输出类似:

ProcessName: powershell
Path: C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
PSVersion: 5.1.x

解决思路很直接:安装 PowerShell 7,并让 Codex 后续默认能找到 pwsh.exe。
下载安装 PowerShell 7
官方推荐方式可以使用 WinGet 或 MSI 安装包。Microsoft 官方文档提供了 Windows 安装说明,也列出了 MSI、MSIX、ZIP 等安装方式。
WinGet 安装:

winget install --id Microsoft.PowerShell --source winget

如果想安装 MSI 版本:

winget install --id Microsoft.PowerShell --source winget --installer-type wix

也可以从官方 GitHub Release 下载 MSI 安装包,然后双击安装。
个人比较推荐去官方网页直接下载MSI包:https://learn.microsoft.com/zh-cn/powershell/scripting/install/install-powershell-on-windows?view=powershell-7.6#msi


安装时如果看到类似 Add PowerShell to PATH 的选项,建议勾选。MSI 安装也支持 ADD_PATH=1 参数,用来把 PowerShell 加入 Windows PATH 环境变量。
如果你使用自定义安装目录
我的环境里 PowerShell 7 放在:

E:\PowerShell7\7\pwsh.exe

这种情况下,需要把目录加入系统 Path:

E:\PowerShell7\7\

注意加入的是文件夹,不是 pwsh.exe 文件本身。
操作路径:

系统属性 -> 高级 -> 环境变量 -> 系统变量 -> Path -> 编辑 -> 新建

填入:

E:\PowerShell7\7\

如下图所示,一定要保证PowerShell7的路径在PowerShell5的上面! 这是codex优先调用PowerShell7的关键一步。因为默认情况下PowerShell7安装时间肯定更晚,即使加入系统 Path后位置也在PowerShell5的下面,此时codex还是默认使用PowerShell5,无法自动调用PowerShell7。


重启 Codex 验证是否生效
这一点很重要。
修改系统 Path 后,已经运行中的 Codex 进程通常不会自动拿到新的环境变量。需要完整退出并重新打开 Codex。
重启前可能出现:

pwsh

报错:

pwsh : The term 'pwsh' is not recognized

重启 Codex 后再验证。
在 Codex 里执行:

Get-Process -Id $PID | Select-Object Id,ProcessName,Path
$PSVersionTable.PSVersion
$PSHOME

期望看到:

ProcessName: pwsh
Path: E:\PowerShell7\7\pwsh.exe
PSVersion: 7.x

再执行:

Get-Command powershell,pwsh -ErrorAction SilentlyContinue |
  Select-Object Name,CommandType,Source,Path |
  Format-List

正常情况下会看到:

powershell.exe -> C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
pwsh.exe       -> E:\PowerShell7\7\pwsh.exe

这个结果说明:
pwsh 已经可以调用 PowerShell 7powershell 仍然是系统自带 PowerShell 5.1Codex 当前默认 shell 已经进入 PowerShell 7不建议依赖 shell_path 配置
我也尝试过在 Codex 配置里写:

shell_path = "E:\\PowerShell7\\7\\pwsh.exe"

配置文件位置一般是:

C:\Users\<用户名>\.codex\config.toml

但实测这个配置没有让当前本地命令通道稳定切到 PowerShell 7。OpenAI 官方 Codex 配置参考里也没有把 shell_path 列为公开配置项。
所以更可靠的做法是:
安装 PowerShell 7把 pwsh.exe 所在目录加入系统 Path,且优先于Powershell 5重启 Codex用命令确认当前进程确实是 pwsh常见问题1. 已经加了 Path,为什么 Codex 还是找不到 pwsh?
通常是 Codex 还没有重启。
可以先检查系统 Path:

[Environment]::GetEnvironmentVariable('Path','Machine') -split ';' |
  Where-Object { $_ -match 'PowerShell' }

也可以检查当前进程 Path:

$env:Path -split ';' |
  Where-Object { $_ -match 'PowerShell' }

如果系统 Path 有 PowerShell 7,但当前进程 Path 没有,重启 Codex 即可。
2. PSModulePath 有用吗?
没有。启动 pwsh.exe 看的是 Path,不是 PSModulePath。
PSModulePath 用来搜索 PowerShell 模块,比如 Import-Module。它不会决定启动 PowerShell 5 还是 PowerShell 7。
3. 以后还会遇到中文或引号问题吗?
会明显减少,但不能保证完全消失。但目前我自己使用下来没有再出现过codex主动说“又被Powershell咬了一口”的情况···,实际查看运行日志基本全部调用pwsh命令且均执行成功。
PowerShell 7 对 UTF-8、现代命令行行为、跨平台兼容性更好,中文输出和脚本兼容性会稳定很多。
但复杂命令仍可能经过多层解析:

Codex -> PowerShell 7 -> 外部程序 -> 程序自己的参数解析

下面这些场景仍要注意:
JSON 参数正则表达式中文路径多层嵌套引号node -epython -ccmd /cbash -lc
遇到复杂命令时,建议使用脚本文件、参数数组或 here-string,减少一行命令里的引号嵌套。
最终效果
配置完成后,在 Codex 中执行本地 shell 命令,默认环境可以变成:

PowerShell 7.x
E:\PowerShell7\7\pwsh.exe

这能明显降低 Windows PowerShell 5.1 带来的编码、中文路径、引号解析和语法兼容问题。
参考资料Microsoft PowerShell 7 Windows 安装文档:https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windowsPowerShell 环境变量说明:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_providerPSModulePath 说明:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_psmodulepathCodex 配置基础:https://developers.openai.com/codex/config-basicCodex 配置参考:https://developers.openai.com/codex/config-reference
不仅是codex,所有的coding agent在Windows上都比在Linux、mac上的差一些。因为Windows没有命令行生态。
迂回一点的方案,让它不要调用shell命令,而是写Python去实现,这样就不用和Windows的cmd或者PowerShell搏斗了。
懂你在说什么,但是有点怪。
WSL说白了就是在 Windows 上虚拟化一个 Linux。
都这样了,很难说什么 Windows 桌面版满不满血了。
这不就直接把 Windows 绕过去了吗?
如果可以的话,还是直接在 AI 编程这件事上放弃 Windows 吧。
不光是那些狗屁倒灶的 cmd 和 PowerShell 各自好几个版本语法不一样的问题,还有各种路径体系混乱、编码乱码乱七八糟的,实在是难顶。
在 Windows 把 Codex 运行在 WSL2 上确实会有改善,但说「满血」这个词也有点怪。
因为问题的来源是 Codex 根本没法稳定判断自己的环境究竟是运行在 Windows 还是哪个版本的 cmd 或者 PowerShell 还是哪个版本的 Python 还是 WSL 上。
在 WSL 上运行,只是说 Codex 本身经常默认下意识使用 Linux 的命令,那使用了 WSL,这个时候出错的概率就会降低。
但其实就算不在 WSL 上运行,一般情况下也就是发现自己写错了,然后重新写一遍,浪费点 token 浪费点时间,不会有什么太致命的影响。
而且一般 Windows 上最好在 Agents.md 里面限定一下使用的系统和 PowerShell 版本,顺便要求一些能用 Python 实现的事情直接使用 Python,这样也能避开一部分因为 PowerShell 不同版本语法不一样带来的问题。
但是我说句实话,直接换成 Mac 会舒服很多。
我用了一辈子 Windows ,真的非常习惯使用 Windows。
上一份工作需要自己带电脑,一狠心花了两万多买了一台 MacBook Pro。坚持用了一个月,实在是用不惯,然后把家里闲置的 Windows 主机和显示器搬去了公司。那台 MacBook Pro 是我这辈子买的最亏的电子产品,所谓的修图更好、剪辑更好,我基本没咋体会出来。
我在家里的主力 PC 是Z790 + 14900KF + 64G + RTX 4090,虽然现在有点过时了,但这台电脑是三年前配的,加上5 个M.2盘位插满,其实 3 根是 4T,还有鼠标、键盘、音箱这些外设,怎么着也得接近小 5 个 W了,你可想而知我是多爱用 Windows。我从拥有第一台 Mac OS 的设备到现在也得五六年了,但很多基础的操作,比如按住 Option + 右键才能复制文件路径,我都是今年才学会的。
今年我强行克服了 Mac OS 的使用习惯障碍,绝大多数时间的主力设备变成了 Mac mini,没别的原因,实在就是 Mac 在 Vibe Coding 上要舒服太多了。
送礼物
还没有人送礼物,鼓励一下作者吧
想象一下——你刷到一个 Codex 视频,博主演示 AI 自动写代码、修 Bug、一句命令搞定整个项目。你心动了,点开评论区想看看大家怎么用——结果几百条评论清一色是:
"怎么安装啊?"
"收费吗?免费吗?"
没人讨论功能,全在问安装和价格。
这篇文章就是写给评论区的你。十分钟读完,从零到跑起来。
一、Codex 是什么(30秒了解)
Codex 是 OpenAI 出品的 AI 编程智能体——给它一句自然语言指令,它就能在项目里新建文件、修改代码、运行测试、提交 Git,全程自动。


一个容易混淆的点:Codex 本身不是大模型,它是一个智能体应用。它调用的是 ChatGPT / GPT-5.5 的能力,就像微信 App 调用后台服务器——功能在客户端,数据和推理都在云端。
二、前置条件:你需要准备什么
动手之前,先确认你的电脑满足以下条件:
类别要求说明操作系统Windows 10 / 11 64 位Codex 只提供 x86_64 版本,32 位系统不支持,需要Windows 10 版本 19041.0 或更高版本内存4GB 以上(推荐8GB)4GB 勉强能跑,任务多了会卡磁盘50GB 可用空间Git 约 300MB + CCSwitch 约 200MB + Codex + 缓存日志网络必须联网下载安装包 + 调用 AI API 都需要
如果你不确定自己电脑是不是 64 位,右键"此电脑"→"属性",看"系统类型"一栏。凡是显示"64 位操作系统"就没问题。


三、安装清单:装哪些软件、各干什么用、按什么顺序
以下是你要装的所有软件,按顺序来。每个都标了"是什么""为什么装""必装还是建议",看完心里有谱再动手:
顺序软件是什么为什么要装必装/建议1Git版本管理工具Codex 的硬性门槛——不在 Git 仓库里直接拒绝运行,没有 Git 连 Codex 都打不开必装2Node.jsJavaScript 运行时CCSwitch 的依赖(见第 6 项);实际开发中 npm 基本逃不掉必装3Windows Terminal微软官方终端神器多标签、好看好用。既然都进命令行了,配好终端不亏建议4CodexAI 编程助手(主角)这篇文章的目的。必装5CCSwitch多模型管理平台(GUI)接入国产大模型的关键。自动解决协议转换问题,图形界面选模型填 Key 就能用接入国产模型时必装
为什么是这个顺序? 1-2 是基础环境,先铺好;4 是主角登场;5 最后装,因为它依赖 Node.js(第 2 项)和 Codex(第 4 项)都就位。
下载地址汇总:
Git:https://git-scm.com/download/win(一路默认即可)


Node.js:https://nodejs.org/zh-cn/download(选 LTS 版本)


Windows Terminal:Microsoft Store 搜索免费安装
非必须,可以参考我以往文章
Codex:https://apps.microsoft.com/detail/9plm9xgg6vks?hl=zh-CN&gl=CN


CCSwitch:https://ccswitch.io/zh/(下载 .msi)


四、安装codex
git、nodejs、ccswitch下载后直接双击安装即可,不做过多介绍。
codex进入下载页面,点击下载就会下载exe文件,有时候安装了杀毒软件会报安全警告,忽略就可以


双击下载后的exe文件安装,会弹出页面安装,等待安装完成即可。


此时还不能用,可以不用管,我们先配置api key和模型。
五、接入国产大模型
这是全文最核心的章节,也是标题"接入国产大模型"的关键。
以deepseek为例子。
打开官网:https://www.deepseek.com/
打开api开放平台


手机号注册即可
点击充值,可以先充值10块钱体验下


充值成功后创建apikey




这里注意,apikey只能看到这一次,要复制下来粘贴到文本保存下来。


如果忘记了key的内容,直接删除重新创建一个即可。


六、CCSwitch 配置
CCSwitch 可以理解为万能要是,无论是codex、claude code 还是openclaw的配置,操作完全可视化,不用写配置文件:
下载 .msi 安装包,双击安装


打开 CCSwitch,顶部工具栏切换到 Codex 标签


点右上角 + → 预设下拉选你想要的大模型(DeepSeek / 通义千问 / Kimi / 智谱 等)


填 deepseek的API Key → 添加


点击设置按钮


点击路由--在主页面显示本地路由开关打开--保存


回到主页面,可以看到页面多了一个开关的按钮,点击打开,codex的路由就启用了。


启动配置的deepseek,点击启用按钮,使用中状态说明当前使用的是deepseek


CCSwitch 预设了 20+ 个国产模型供应商(DeepSeek、智谱、百炼/通义、Kimi、豆包、MiniMax、阶跃星辰等),选预设即可自动填充端点地址,不用自己拼 URL。如果你使用的是中转站,一般不需要路由,直接按照中转站的文档配置即可。这里先不说那么深,避免接收太多信息,搞混乱了。
七、codex配置
打开安装后的codex程序


选择其他方式登录


输入deepseek的api key,点击继续


可以登录进来了,现在是英文,可以先忽略,下面步骤会配置为中文


设置中文,点击左下角settings--settings


点击General--Language--语言选择中文--保存,重启codex客户端。


这里有个问题装好 Codex 之后你可能会发现一个奇怪的现象:设置里选了中文,界面却还是英文。如果你有梯子,一般会成功,如果没有,就不会切换成功。
为什么切不了中文?
翻译文件其实就在你电脑上,根本不需要联网下载。Codex 内置了 60+ 种语言的翻译包。问题出在初始化逻辑:
Codex 启动时写死了 locale: 'en'(英文),然后根据你的 IP 地址去向 OpenAI 服务器请求语言信号。中国 IP 返回「用中文」,非中国 IP 返回空——所以不挂梯子,请求不通,选了中文也白选,导致切换失败。
一键汉化脚本(codex版本更新可能失效)
我写了一个 PowerShell 脚本,自动找到 Codex 安装目录 → 解包 → 改掉那一行硬编码 → 重新打包。不需要 VPN,不需要联网,跑完重启 Codex 就是中文。(codex V0.141.0版本+win10系统测试有效,其他系统未知)
使用方法:
以管理员身份打开 PowerShell,点击开始--windows powershell目录下的windows powershell--右键单击--以管理员身份运行。


从 GitHub 下载脚本,或复制下方完整代码保存为 codex-cn.ps1。C:\Users\Administrator\codex-cn.ps1是codex-cn.ps1文件所在的目录路径,根据你实际情况替换。把下面的命令贴入powershell执行。

powershellpowershell -ExecutionPolicy Bypass -File "C:\Users\Administrator\codex-cn.ps1"

脚本内容:

# Codex Chinese Patch v2.0
# Run as Administrator: powershell -ExecutionPolicy Bypass -File codex-cn.ps1

# Auto-elevate if not running as Administrator
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "Requesting Administrator privileges..." -ForegroundColor Yellow
    Start-Process powershell -ArgumentList "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
    exit
}

$ErrorActionPreference = "Continue"

Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "  Codex Hanhua Patch v2.0" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""

# Check Node.js
if (-not (Get-Command node -ErrorAction SilentlyContinue)) {
    Write-Host "ERROR: Node.js not found! Install from https://nodejs.org" -ForegroundColor Red
    pause; exit 1
}

# === Step 1: Find Codex ===
Write-Host "[1/5] Finding Codex installation..." -ForegroundColor Yellow

# Search for app.asar across all possible locations
$asarFile = $null
$appDir = $null
$codexDir = $null

# Priority 1: WindowsApps (Store install)
$waDirs = Get-ChildItem "C:\Program Files\WindowsApps" -Directory -Filter "OpenAI.Codex_*" -ErrorAction SilentlyContinue | Sort-Object Name -Descending
foreach ($d in $waDirs) {
    $found = Get-ChildItem $d.FullName -Recurse -Filter "app.asar" -ErrorAction SilentlyContinue | Select-Object -First 1
    if ($found) {
        $asarFile = $found
        $appDir = $found.DirectoryName
        $codexDir = $d
        break
    }
}

# Priority 2: LocalAppData (non-Store install)
if (-not $asarFile) {
    $laDirs = Get-ChildItem "$env:LOCALAPPDATA\OpenAI\Codex" -Directory -ErrorAction SilentlyContinue
    foreach ($d in $laDirs) {
        $found = Get-ChildItem $d.FullName -Recurse -Depth 3 -Filter "app.asar" -ErrorAction SilentlyContinue | Select-Object -First 1
        if ($found) {
            $asarFile = $found
            $appDir = $found.DirectoryName
            $codexDir = $found.Directory.Parent.Parent  # go up to the version root
            break
        }
    }
}

if (-not $asarFile) {
    Write-Host "ERROR: app.asar not found!" -ForegroundColor Red
    Write-Host "  Searched WindowsApps and LocalAppData" -ForegroundColor DarkGray
    pause; exit 1
}
$asarPath = $asarFile.FullName
Write-Host "  Version: $($codexDir.Name)" -ForegroundColor Green
Write-Host "  Path: $appDir" -ForegroundColor Green

# === Step 2: Setup workspace ===
Write-Host "[2/5] Setting up workspace..." -ForegroundColor Yellow
$workDir = Join-Path $env:TEMP "codex-cn-patch"
Remove-Item $workDir -Recurse -Force -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Path $workDir -Force | Out-Null
$extractDir = Join-Path $workDir "extracted"
New-Item -ItemType Directory -Path $extractDir -Force | Out-Null
Write-Host "  Workspace: $workDir" -ForegroundColor Green

# === Step 3: Extract asar ===
Write-Host "[3/5] Extracting app.asar (~169MB, please wait)..." -ForegroundColor Yellow
Copy-Item $asarPath (Join-Path $workDir "app.asar") -Force
$unpackedPath = Join-Path $appDir "app.asar.unpacked"
if (Test-Path $unpackedPath) {
    Copy-Item $unpackedPath (Join-Path $workDir "app.asar.unpacked") -Recurse -Force -ErrorAction SilentlyContinue
}

Push-Location $workDir
npx --yes @electron/asar extract app.asar extracted 2>&1 | Out-Null
Pop-Location

if (-not (Test-Path (Join-Path $extractDir "webview"))) {
    Write-Host "ERROR: Extraction failed! webview directory not found" -ForegroundColor Red
    pause; exit 1
}
Write-Host "  Extraction complete" -ForegroundColor Green

# === Step 4: Patch locale ===
Write-Host "[4/5] Searching for locale initialization code..." -ForegroundColor Yellow

$allJs = Get-ChildItem (Join-Path $extractDir "webview") -Recurse -Filter "*.js" -ErrorAction SilentlyContinue
Write-Host "  Scanning $($allJs.Count) JS files..." -ForegroundColor DarkGray

$targetFile = $null
foreach ($f in $allJs) {
    try {
        $txt = Get-Content $f.FullName -Raw -ErrorAction Stop
        # Match: locale:`en`,messages:{}
        if ($txt -match "locale:``en``,messages:\{\}") {
            $targetFile = $f
            Write-Host "  Found: $($f.Name)" -ForegroundColor Green
            break
        }
    } catch {}
}

if (-not $targetFile) {
    Write-Host "ERROR: Locale initialization pattern not found!" -ForegroundColor Red
    Write-Host "  Searched for: locale:``en``,messages:{}" -ForegroundColor DarkGray
    Write-Host "  The Codex version may have changed its i18n implementation." -ForegroundColor DarkGray
    pause; exit 1
}

# Read and check if already patched
$content = Get-Content $targetFile.FullName -Raw
$alreadyPatched = $content -match "locale:``zh-CN``"
if ($alreadyPatched) {
    Write-Host ""
    Write-Host "========================================" -ForegroundColor Green
    Write-Host "  Already patched! No changes needed." -ForegroundColor Green
    Write-Host "========================================" -ForegroundColor Green
    Remove-Item $workDir -Recurse -Force -ErrorAction SilentlyContinue
    pause; exit 0
}

# Replace: locale:`en` -> locale:`zh-CN`
$newContent = $content -replace "locale:``en``", "locale:``zh-CN``"

if ($content -eq $newContent) {
    Write-Host "ERROR: Replacement failed! String not matched" -ForegroundColor Red
    Write-Host "  Content preview (first 500 chars):" -ForegroundColor DarkGray
    Write-Host $content.Substring(0, [Math]::Min(500, $content.Length)) -ForegroundColor DarkGray
    pause; exit 1
}

# Write with UTF-8 encoding
$utf8 = New-Object System.Text.UTF8Encoding $false
[System.IO.File]::WriteAllText($targetFile.FullName, $newContent, $utf8)
Write-Host "  Patched: en -> zh-CN" -ForegroundColor Green

# === Step 5: Repack and replace ===
Write-Host "[5/5] Repacking app.asar..." -ForegroundColor Yellow
Push-Location $workDir

# Use single quotes to avoid { } being treated as script blocks
npx --yes @electron/asar pack extracted app-patched.asar --unpack-dir '{.node,.dll,.exe,.CMD,.ps1}' 2>&1 | Out-Null

if (-not (Test-Path "app-patched.asar")) {
    Write-Host "ERROR: Repack failed!" -ForegroundColor Red
    Pop-Location; pause; exit 1
}
Pop-Location

$patchedSize = (Get-Item (Join-Path $workDir "app-patched.asar")).Length
Write-Host "  Repacked: $([math]::Round($patchedSize / 1048576, 1)) MB" -ForegroundColor Green

# Kill any running Codex to release file locks
Write-Host "  Stopping Codex if running..." -ForegroundColor DarkGray
Get-Process -Name "Codex" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 1

# Take ownership of the resources directory + the asar file
Write-Host "  Taking ownership..." -ForegroundColor DarkGray

# Reset inheritance, take ownership, grant full control
icacls $asarPath /inheritance:r /grant "Administrators:(F)" /Q 2>&1 | Out-Null
takeown /F $asarPath 2>&1 | Out-Null
icacls $asarPath /grant "Administrators:(F)" /Q 2>&1 | Out-Null

# Also the directory
takeown /F $appDir /R /D Y 2>&1 | Out-Null
icacls $appDir /grant "Administrators:(OI)(CI)F" /T /Q 2>&1 | Out-Null

# Wait for ACL propagation
Start-Sleep -Seconds 3
Write-Host "  Permissions granted" -ForegroundColor Green

# Backup original - use cmd copy which handles WindowsApps better
Write-Host ""
$bakPath = Join-Path $appDir "app.asar.bak"
Write-Host "  Backing up original..." -ForegroundColor DarkGray
cmd /c "copy /y `"$asarPath`" `"$bakPath`"" 2>&1 | Out-Null
if (Test-Path $bakPath) {
    Write-Host "  Backup: app.asar.bak" -ForegroundColor Green
} else {
    Write-Host "  Backup skipped (will keep original safe)" -ForegroundColor DarkYellow
}

# Replace - simplest possible approach after ACL changes
Write-Host "  Replacing app.asar..." -ForegroundColor DarkGray
$patchedPath = Join-Path $workDir "app-patched.asar"

$result = cmd /c "copy /y `"$patchedPath`" `"$asarPath`" 2>&1"
Write-Host "  copy result: $result" -ForegroundColor DarkGray

# Verify
$actual = (Get-Item $asarPath -ErrorAction SilentlyContinue)
if ($actual -and $actual.Length -gt 100000) {
    Write-Host "  Replaced successfully! ($([math]::Round($actual.Length/1MB,1)) MB)" -ForegroundColor Green
} else {
    Write-Host "ERROR: Replace failed. File may be locked by another process." -ForegroundColor Red
    Write-Host "  Please close all Codex windows and try again." -ForegroundColor Red
    Remove-Item $workDir -Recurse -Force -ErrorAction SilentlyContinue
    pause; exit 1
}

# Cleanup
Remove-Item $workDir -Recurse -Force -ErrorAction SilentlyContinue

Write-Host ""
Write-Host "========================================" -ForegroundColor Green
Write-Host "  Patch complete! Restart Codex to apply." -ForegroundColor Green
Write-Host "  To revert: rename app.asar.bak to app.asar" -ForegroundColor DarkGray
Write-Host "========================================" -ForegroundColor Green

pause

脚本自动完成:
搜索 Codex 安装目录(自动适配不同版本号)解包 app.asar在所有 JS 文件中搜索 locale:'en' 并替换为 locale:'zh-CN'重新打包 → 替换原文件(自动备份为 app.asar.bak)
全程约 2-3 分钟,跑完重启 Codex 即生效。脚本支持重复执行——如果已经汉化过,会自动跳过。
模型说明
启动codex后,可以看到模型位置是自定义,但是看不到具体的模型,这个分厂商,deepseek是这样,智谱的会识别到当前支持的模型,可以鼠标选择切换。


如果使用deepseek,要切换模型,可以打开powershell,上面交过怎么打开,输入命令codex


Plain Text# 输入命令回车/model
可以看到1,2两个模型,按键盘的上下箭头来做选择。


输入内容,看下能不能正常使用


安装部分就讲到这里了,后续会陆续推出使用方法,初学者不需要太在意什么模型,先用起来,当然如果有条件,直接买gpt套餐,就当我没说。国产模型deepseek、智谱都可以的,不过智谱的套餐要抢,非常难抢。熟练后,可以了解下中转站,比较便宜,还有薅羊毛的公益站之类的,但是不稳定,还有跑路风险,这个都是后话了,今天就到这里。
不是 Codex 之类的编程 Agent 在 WSL 中才算“满血”,是大模型对 Windows 的开发生态存在明显的“水土不服”。
就想想模型的那些 Bash 是从开源项目与各种文档中学来的,到了 windows 上需要临时翻译成 PowerShell,造成直接各种踩坑。
比如 PowerShell 允许写 ls cp mv rm cat,看起来和 Linux 一模一样。但这些名称只是 PowerShell cmdlet 的别名,并不拥有 GNU 工具的全部参数,甚至行为逻辑都存在差别。
举个栗子,大模型是如何踩坑的。
根据 Linux 经验生成:
rm -rf dist
在 Bash 中完全正常,但在 PowerShell 中,rm 实际指向 Remove-Item,它没有 GNU rm 的 -rf 参数组合。
于是你得到了红色的报错,经常观察 Agent 思考过程和命令调用记录的人,应该很容易见到这种场面吧。
PowerShell 中应该写成:
Remove-Item -Recurse -Force dist
或简写
rm -r -fo dist
你以为这就完了?等等还有更大的坑了:
在Bash中,因为带有 -f,所以即使 dist 不存在,也会静默处理,不输出错误。
而Powershell 中,dist 不存在,将抛异常,默认会输出一条醒目的红色错误信息。
模型不仅需要理解命令是否成功,还得理解 PowerShell 的终止错误与非终止错误,很可能导致大模型判断为脚本存在错误!
当然你可以这么写:
Remove-Item -Recurse -Force dist -ErrorAction SilentlyContinue
问题是正常人,谁这么写?模型自然会形成更强的 Bash 权重偏向。
再举一个栗子:
C:\Users\alice\project
C:/Users/alice/project
/mnt/c/Users/alice/project
就问你熟不熟?
windows 路径与 linux 的路径斜杠拧巴着了,很容易被当做转义符处理,而 WSL 内的 Linux 明确程序接受 Linux 路径。
类似的问题还有一大堆,什么换行符、空格、文件名大小写、文件权限、环境变量、解释器与编译器来源等等。
甚至智能防火墙都在补刀。因为 PowerShell 是恶意软件钻空子的重灾区,所以往往做严格的"有罪推定"。意味着即使你把开发目录拉入白名单,启发式扫描仍会拦截脚本内容,造成你不得不关闭实时防火墙......
这些问题放在一起,足够写一本《AI 在 PowerShell 下的踩坑记》了。
其实 PowerShell 并不是一个差劲的 Shell,甚至比 Bash 更先进。因为 Bash 管道传的是字符串,而 cmdlet 管道传的是结构化对象。
但 AI 编程 Agent 的主要问题不是语言能力,而是先验分布。模型的 Bash 先验概率远大于 PowerShell,所以生成 Bash 命令对模型而言不是"犯错",是按照"最大概率输出"。
也就是模型见过的绝大多数通用开发操作,默认往往是 Bash,而在windows下开发使用 PowerShell ,是在强制要求它切换到另一套体系。
你要想强制纠正模型的“思维钢印”,就要用系统提示词,反复强调“当前环境是 PowerShell,不得生成 Bash 命令”。
但是“提示词再强也只是后验修正,压不过训练数据的先验”,真是又费 token 占用上下文,又不能 100% 保证,为啥自找麻烦呢?
[收藏本文] 【下载本文】
   数码 最新文章
如何评价华为鸿蒙电脑?
如何看待小米Sky Nomad 小米澎程?
小米为何不惊慌?
codex的windows桌面版真的只有在wsl中才是“
为什么微软还没有倒闭?
如何看待某家touch会议平板拆开后里边是联想
如果雷军从政会怎么样?
抽23个点的美团外卖是不是忒狠了?
微信回应占储存空间8个争议点,承认安装包十
小杨哥和雷军哪个更成功?
上一篇文章      下一篇文章      查看所有文章
加:2026-07-14 14:01:32  更:2026-07-14 14:02:19 
 
娱乐生活: 电影票房 娱乐圈 娱乐 弱智 火研 中华城市 印度 仙家 六爻 佛门 风水 古钱币交流专用 钓鱼 双色球 航空母舰 网球 乒乓球 中国女排 足球 nba 中超 跑步 象棋 体操 戒色 上海男科 80后
足球: 曼城 利物浦队 托特纳姆热刺 皇家马德里 尤文图斯 罗马 拉齐奥 米兰 里昂 巴黎圣日尔曼 曼联
  网站联系: qq:121756557 email:121756557@qq.com  知识库