PowerShell 和 Codex 在打架?可以试试这份提示词

发布于

今天花时间写了篇 codex 下使用 PowerShell 的文章,在 V2EX 上也发一份。

## 背景
最近半年一直 Windows 下使用 **Codex** 开发项目,逐渐把开发环境打造得更接近 Linux 下的开发体验。最近看到很多人反馈 PowerShell 和 Codex 打架的情况,因为这问题我之前就解决了,所以想分享下我的方案。

现在这套环境谈不上多复杂,主要有两个重点:

**先把终端环境统一,再用提示词把大模型的命令习惯掰过来。**

## 先安装 pwsh 7 和 Windows Terminal
如果你还在使用系统自带的 Windows PowerShell 5.1,建议先换成现代 shell:PowerShell 7(pwsh)。
至于 PowerShell 5.1 和 PowerShell 7 的区别,可以找 AI 给你解释一下,但是结论不变:

**现代 Windows 开发环境最好统一到 pwsh 7。**

可以直接用 `winget` 安装:

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

也可以从 [PowerShell 官方安装页面](https://learn.microsoft.com/zh-cn/powershell/scripting/install/install-powershell-on-windows) 下载 MSI 安装包手动安装。

安装后验证,在命令行中输出版本号:

```powershell
PS C:\Users\AAA> pwsh -v
PowerShell 7.x
```

原生的 PowerShell 界面很丑,所以必安装另一个 Windows 神器 `Windows Terminal`。它的价值不只是好看,而是把 `pwsh`、Git Bash、远程 SSH 等环境放在同一个窗口里管理,支持标签页、分屏、统一的字体和编码设置。平时一边让 Codex 在一个窗口里执行命令,一边查看日志或运行服务,效率会高很多。

```powershell
winget install --id Microsoft.WindowsTerminal --source winget
```

也可以通过 [Windows Terminal 官方安装页面](https://learn.microsoft.com/zh-cn/windows/terminal/install) 进入 GitHub Releases,下载对应安装包手动安装。

安装完成后,把 Windows Terminal 的默认配置文件设为 **PowerShell 7**。这样打开后默认就是 pwsh7 的环境。所有提示词、命令和排错过程,都应该建立在同一个 shell 上。

## 安装 `rg`
`rg` 就是 **ripgrep**,一个非常适合在代码仓库里搜索文本的命令行工具,速度快,默认会遵守 `.gitignore`,输出也比 PowerShell 原生搜索更适合直接交给 AI 阅读。

但要注意,`rg` 并不是 Windows 原生命令。需要提前安装一下。

```powershell
# 使用 winget 安装
winget install BurntSushi.ripgrep.MSVC

# 或者使用 Scoop 进行安装
scoop install ripgrep
```

当然也可以从 [ripgrep 官方下载页面](https://ripgrep.dev/download/) 手动下载 Windows 安装包。

安装后记得重新打开 Windows Terminal,否则当前终端可能还没有刷新 PATH。
安装完成后,可以用下面的命令确认是否生效:

```powershell
rg --version
```

## 加提示词约束
把终端环境换好只是第一步。真正影响体验的,是要明确告诉 Codex:**当前项目使用的是 PowerShell,不是 Bash。**

大模型在训练时接触过的编程语料、命令示例和工具调用记录里,Linux、Bash 的比例非常高。所以当你只说“执行一个命令”时,它很容易下意识写出 `grep`、`sed`、`cat` 或 `&&` 这一套 Bash 习惯。命令本身可能没错,但放到 `pwsh` 里就会报错,或者产生和预期不同的结果。

这套提示词约束已经让我在 Windows 环境下顺畅工作了几个月,现在直接分享在下面:

```markdown
## Windows 约束
当前环境是 Windows 10 / pwsh7
- 默认禁止使用 Bash 语法,除非确定此 shell 处在 Linux 环境
- 不要使用 Bash 引号/转义习惯,在 PowerShell 命令里,复杂正则优先用单引号包裹。
- 如果正则本身同时包含单引号和双引号,优先拆成多个简单 rg 命令。
- 执行多行 Python 禁止使用 Bash heredoc;改用 PowerShell here-string | python -
- pwsh 中,语句块表达式(如 `foreach`、`if`)不能直接作为管道输入。需要先使用 `$()` / `@()` 包裹,或先赋值给变量。普通命令输出可直接进入管道,无需额外包裹。
- PowerShell 使用 `rg` 时,通配目录必须先用 `Get-ChildItem -Filter` 展开为真实路径,禁止直接把含 `*` 的搜索路径传给 `rg`。
```

- 可以直接把这段提示词复制到 `C:/Users/<userName>/.codex/[AGENTS.md](http://agents.md/)` 里
- 我这边用的是 `Windows 10 LTSC`,你可以换成你的系统

这套提示词不是为了限制 Codex,而是为了减少它在 shell 之间切换时的冲突。特别是引号、管道、正则和多行脚本,这几类问题经常会打架,一旦出错,让 AI 自动修正会浪费很多时间。

## 为什么这几条约束值得保留
- **明确 shell**:让 Codex 从一开始就知道命令要交给 `pwsh`,避免默认生成 Bash 命令。
- **约束引号和转义**:PowerShell 的字符串、正则和变量展开规则不同,先规定写法,能少踩一轮转义的坑。
- **替代 heredoc**:Windows 下没有 Bash heredoc,PowerShell here-string 才是稳定的多行文本方案。
- **处理语句块管道**:`foreach`、`if` 这类语句块不能直接当作普通管道输入,提前写进规则后,Codex 不会反复生成同一种错误写法。
- **处理 `rg` 通配路径**:先展开真实目录再搜索,比把 `*` 直接交给命令更符合 PowerShell 和 Windows 的路径行为。

我的经验是,提示词不需要写得特别长,但要把**最容易出错、而且会反复出错的地方**说清楚。规则稳定下来之后,Codex 执行命令的成功率会明显提高,来回打架解释“这不是 Bash,请改成 PowerShell”的次数也少很多。

## 总结
Codex 下 PowerShell 执行时打架的原因,就是因为它在猜你的 shell。
把环境写清楚,把容易错的语法提前约束好,Windows 下的开发体验会立刻稳定提升一截。

---

> 原创声明: 本文首发于个人博客 [原文地址](https://blog.knowckx.de/) 欢迎各位大佬交流

---

原文链接:[点击查看](https://www.v2ex.com/t/1228204)

评论(17)

感谢分享!每次看到 AI 写命令动不动就报错,还得手动去查是真的头疼,马上去试试这套方案。

· 0 个赞

回复

话说我 Windows 里面的那个终端,其实就是 Windows Terminal 啊,这俩不是一个东西吗?

· 0 个赞

我是直接让 AI 帮我从零撸了一个环境部署包,一键搞定 PowerShell 7、rg、字体以及各种好用的插件,顺便把全局的 AGENTS.md 约束也给写进去了,主打一个省事。

· 0 个赞

回复

对,就是类似做了一个工程包,把离线资源、各种脚本以及全局的约束配置都打包好了。里面包含 WindowsTerminal、PowerShell7、各种字体、插件还有 Codex 的 AGENTS.md。直接让 Codex 读取并帮忙一键安装。

· 0 个赞

感谢分享,我已经把这套规则原封不动加进我的 Agents.md 里了,这就去试试看效果。

· 0 个赞

有一说一,既然这么麻烦,为什么不直接用 WSL 呢?

· 0 个赞

回复

WSL 有时候一样让人绷不住,各种奇怪的环境问题也是够折腾的。(附图)

· 0 个赞

回复楼上几个老哥:欢迎加入 Windows 开发大军!搞安装包的这位老哥动手能力很强啊。关于 WSL,确实可以用,不过主要得看它在你的具体业务场景下,带来的收益是不是大于折腾环境的成本。如果大家在试用我的规则时遇到什么问题,也欢迎随时来交流。

· 0 个赞

其实现在一些国产的 IDE 在这些兼容适配上面已经下了很多功夫了。说实话,老版本的 pwsh5 真的是万恶之源。

· 0 个赞

大家在 Windows 下用 Codex 的时候,平时敢不敢直接开 yolo 模式让它全自动跑啊?

· 0 个赞

另外我发现在新版本里,只要你在 agents.md 里面声明了你的环境,AI 基本就能自己搞定兼容问题了。比如针对多行 Python 脚本,它现在已经知道要改用 PowerShell 的 Here-String,而不会傻乎乎地去用 Bash 的语法。

· 0 个赞

我的做法比较简单粗暴:直接让它先跟 PowerShell 搏斗一个月,然后让它自己总结踩了哪些坑,最后生成一份约束规则,这招挺好使的。

· 0 个赞

蹲一下,我觉得在 Windows 上直接上 WSL 就完事了,从根本上解决跟 PowerShell 打架的问题。

· 0 个赞

回复

确实,直接用 WSL 也是个挺不错的新思路。

· 0 个赞

回复几个老哥:对,老版本 PowerShell 那个默认的 UTF-8 BOM 编码简直是个巨坑。另外我的这套约束主要就是为了让 AI 别再生成 Bash 的 heredoc。我自己平时积累提示词也是这样,每次报错就让它回溯一下具体执行过程,然后总结写进规则里。

· 0 个赞

马住,目前主力机是 mac ,先收藏备用,等回头换工作用 Windows 再试。

· 0 个赞

感谢分享,已经把规则配置进去了,先体验一波看看效果。

· 0 个赞