前言

最近在 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 7
  • powershell 仍然是系统自带 PowerShell 5.1
  • Codex 当前默认 shell 已经进入 PowerShell 7

不建议依赖 shell_path 配置

我也尝试过在 Codex 配置里写:

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

配置文件位置一般是:

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

但实测这个配置没有让当前本地命令通道稳定切到 PowerShell 7。OpenAI 官方 Codex 配置参考里也没有把 shell_path 列为公开配置项。

所以更可靠的做法是:

  1. 安装 PowerShell 7
  2. pwsh.exe 所在目录加入系统 Path,且优先于Powershell 5
  3. 重启 Codex
  4. 用命令确认当前进程确实是 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 -e
  • python -c
  • cmd /c
  • bash -lc

遇到复杂命令时,建议使用脚本文件、参数数组或 here-string,减少一行命令里的引号嵌套。

最终效果

配置完成后,在 Codex 中执行本地 shell 命令,默认环境可以变成:

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

这能明显降低 Windows PowerShell 5.1 带来的编码、中文路径、引号解析和语法兼容问题。

参考资料


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐