本页解决什么问题
Windows 上的开发工具通常同时经过操作系统、终端、Shell、Git、编辑器和网络代理。看到同一条命令在 PowerShell、CMD 和 WSL2 中表现不同,并不一定是工具故障,常见原因是当前 Shell、当前目录、PATH、权限或编码环境不一致。 本页把这些边界放在一起说明,适用于使用 Codex CLI、Git、Node.js、Python 以及常见构建工具的 Windows 开发者。重点不是记住某一个版本的界面,而是学会先确认环境,再执行动作,最后用证据验证结果。 本文默认使用 Windows 11;Windows 10 也可参考,但系统策略、Windows Terminal、ConPTY、WSL2 和 PowerShell 版本可能不同。涉及 Codex 的具体参数,以本机codex --help 和官方文档为准。
先建立环境模型
在 Windows 上,至少要区分四个层次:- Windows 原生环境:程序使用 Windows 文件系统、Windows 权限和
.exe进程模型。 - PowerShell:Windows 上功能完整的 Shell,命令、变量、管道和对象模型与 Bash 不同。
- CMD:兼容性很强的传统 Shell,语法简单,但脚本能力和诊断能力有限。
- WSL2:运行 Linux 内核环境的虚拟化子系统,有独立的 Linux 用户、PATH、权限和进程空间。 “打开了终端”不是充分信息。排查问题时,必须同时记录:
- 使用的是 Windows PowerShell 5.1、PowerShell 7、CMD 还是 WSL2 Bash;
- 当前工作目录是什么;
- 命令实际解析到哪个文件;
- 当前用户和是否提升为管理员;
- 网络是否经过代理;
- 文件是由 Windows 工具还是 Linux 工具写入的。
一分钟环境检查
在 PowerShell 中执行:选择原生 Windows 还是 WSL2
默认原则是:项目使用 Windows 工具链,就在原生 Windows 中工作;项目依赖 Linux 工具链,就在 WSL2 中工作。不要为了“看起来更专业”而额外引入另一套环境。原生 Windows 适合这些情况
- 使用 Visual Studio、MSBuild、Windows SDK 或
.NETWindows 项目; - 项目依赖 PowerShell、Windows 服务、注册表或 Windows API;
- 使用 Windows 版 Git、Node.js、Python 和 VS Code;
- 仓库位于
C:\Users\...,团队也主要在 Windows 上开发; - 需要直接调用
.exe、winget或 Windows 凭据管理器。
WSL2 适合这些情况
- 构建脚本只在 Bash、GNU 工具或 Linux 环境下可靠;
- 依赖 Linux 包管理器、容器工具或 Linux 原生编译链;
- 项目部署目标是 Linux,开发环境需要尽量接近生产环境;
- 仓库和依赖已经位于 WSL2 的 Linux 文件系统中。
WSL2 的文件位置
WSL2 中的 Linux 项目建议放在:/mnt/c/Users/...。Windows 挂载盘在 WSL2 中通常有更高的 I/O 开销,也更容易遇到大小写、符号链接、权限和文件监听差异。
从 Windows 访问 WSL2 文件,可在资源管理器地址栏输入:
安装和检查 WSL2
使用管理员 PowerShell:VERSION 为 2。已有发行版需要转换时,先备份,再执行类似命令:
PowerShell、CMD 和 WSL2 的命令差异
下面是最常用的对应关系:PS C:\> 通常是 PowerShell,C:\> 通常是 CMD,user@host:~$ 通常是 WSL2 Bash。
路径规则
Windows 原生路径
Windows 常见绝对路径如下:PowerShell 中的反斜杠
PowerShell 不把反斜杠当作转义字符,但反引号` 才是 PowerShell 的转义符。下面的路径可以直接使用:
Join-Path,不要手工堆叠斜杠:
-LiteralPath 会把 [、]、* 等字符按普通字符处理;处理用户提供的路径时优先使用它。
CMD 中的路径
CMD 使用双引号包裹含空格的路径:cd /d 可同时切换盘符和目录。只写 cd C:\... 时,在某些 CMD 会话中不会切换当前盘符。
WSL2 路径映射
Windows 盘符通常映射为/mnt/<盘符小写>:
C:\Users\alice\code 与 WSL2 路径 /mnt/c/Users/alice/code 指向同一位置,但它们不是同一个 Shell 的字符串格式。需要转换时可使用:
/mnt/c/... 直接当成 Linux 原生路径使用,也不要在 PowerShell 中照抄 /home/alice/...。
特殊路径和大小写
Windows 文件名通常不区分大小写,Linux 通常区分大小写。一个在 Windows 上可用的Readme.md,在 WSL2 中可能与 README.md 被视为两个文件。提交前检查真实名称:
CON、PRN、AUX、NUL、COM1 和 LPT1,不要用它们作为普通文件名。过长路径、尾随空格和尾随句点也可能在不同工具中产生不一致行为。
当前目录是安全边界
运行 Codex 或脚本前,先打印当前目录:C:\、用户根目录、系统目录或生产挂载目录中直接实验。
PATH 和命令解析
PATH 是一组目录,Shell 会按顺序在其中寻找可执行文件。常见问题不是程序没安装,而是当前终端没有看到正确的 PATH,或 PATH 中有多个同名版本。查看 PATH
PowerShell:查找实际命令
PowerShell:Get-Command 可能显示别名、函数、脚本和应用程序;检查 CommandType 与 Source,不要只看命令名称。
临时修改 PATH
只对当前 PowerShell 进程有效:避免 PATH 污染
不要把当前目录.、下载目录或不可信的可写目录放到 PATH 前面。PATH 中同名的 git.exe、node.exe 或脚本可能导致运行了错误版本,甚至执行恶意文件。
发现多个版本时,先记录路径和版本,再决定保留哪一个:
安装 Codex 与验证
Windows 原生安装优先使用官方安装方式。执行远程脚本前,应确认来源、网络和组织政策,不能把“网上复制的一行命令”当作天然安全。 PowerShell 安装命令示例:ByPass 只作用于该次 PowerShell 进程,不等于永久关闭执行策略;irm 是 Invoke-RestMethod 的别名,iex 是 Invoke-Expression 的别名。更严格的做法是先下载并审阅脚本,再执行本地文件:
npm。先检查:
codex。先用 Get-Command codex -All 找出实际来源,再按安装方式清理多余版本。
登录、凭据和项目边界
启动 CLI 前进入实际项目目录:auth.json、API key、.env、SSH 私钥、浏览器 Cookie 或调试输出提交到 Git。检查仓库状态:
Windows 权限模型
Windows 权限至少涉及三个概念:用户账户、管理员令牌和文件系统 ACL。打开“管理员 PowerShell”只解决一部分权限问题,不能自动赋予网络、企业策略、服务控制或其他用户目录的访问权。 查看当前身份:net session 需要管理员权限;失败不代表所有文件访问都失败,只表示当前令牌不能执行该查询。
查看文件 ACL:
icacls 查看更完整的继承信息:
Everyone:F。这会把写权限扩大到不必要的账户,可能让恶意程序或其他用户篡改源码、脚本和配置。
权限问题的处理顺序
- 确认当前路径和目标文件确实是你要操作的对象。
- 确认文件是否被其他进程占用、是否位于受保护目录。
- 查看 ACL 和文件属性,不要直接修改所有权。
- 尝试在用户目录建立最小复现。
- 只有明确知道影响范围时,才请求管理员批准。
- 修改权限后记录原始 ACL,并验证普通用户仍不能访问不该访问的内容。 文件被标记为只读时,可先查看属性:
Codex Windows 沙箱的边界
Codex 的沙箱模式、审批模式和配置键以当前版本为准。Windows 原生环境通常需要在更严格的权限边界中运行命令;某些初始化动作可能需要管理员批准。不要因为一次命令失败就永久关闭保护。 若看到“目录可被 Everyone 写入”之类警告,应把它当作权限审计提示。先定位具体目录,再缩小写权限,或改用专门的用户目录。不要通过把整个项目开放给所有用户来消除警告。 遇到 Windows 沙箱初始化错误时,先收集:.sandbox-secrets 等目录。公司设备上的登录权限、组策略、防火墙规则可能由 IT 管理,普通用户不应自行绕过。
Git 在 Windows 上的基础检查
进入仓库后先检查:git reset --hard、git clean -fd 或不加确认的覆盖操作。
换行符
Windows 文本文件常见CRLF,Linux 项目通常约定 LF。团队应在仓库中使用 .gitattributes 明确规则,例如:
core.autocrlf 常见取值包括 true、input 和 false。应该服从项目规范;如果没有规范,优先在 .gitattributes 中固定仓库行为,再谨慎调整本机配置。
编码和 BOM
Windows PowerShell 5.1 的Out-File -Encoding utf8 通常会写入 UTF-8 BOM;PowerShell 7 的编码默认行为不同。脚本、JSON、Markdown 和源码是否允许 BOM,要看项目工具链。
PowerShell 7 中写入 UTF-8 无 BOM 的示例:
chcp 查看或切换代码页:
chcp 65001 只影响当前 CMD 会话,不能修复文件本身的编码。乱码时分别检查文件编码、终端字体、Shell 代码页和程序自身的输入输出设置。
Git 的用户名和提交边界
查看提交身份:git commit、git push 或发布命令。
网络、代理和证书
安装、登录、拉取依赖和访问 API 可能需要代理。代理至少有三层:Windows 系统代理、WinHTTP 代理以及应用自己的环境变量。配置一层不代表所有程序都会使用它。 查看 PowerShell 当前进程的代理变量:-k 或关闭 TLS 校验;先检查系统时间、根证书、企业中间人证书和代理配置。
进程和端口诊断
PowerShell 查看进程
查看端口占用
/T 会连同子进程结束,开发服务器、测试运行器和终端复用器可能因此一起退出。优先使用应用自己的停止命令;不得为了释放端口而批量结束所有 node.exe。
WSL2 进程
常见错误速查
诊断工作流
遇到问题时按以下顺序执行,避免在多个变量同时变化时盲目重装:- 复现:记录完整错误、命令、Shell、目录、时间和版本。
- 定位:确认命令解析路径、环境变量、用户身份和目标文件。
- 缩小:在用户目录或临时仓库中建立最小复现。
- 对比:比较 PowerShell、CMD、WSL2,或比较新终端与旧终端。
- 修复:一次只改一个变量,优先改项目级配置。
- 验证:重启受影响的进程,重新执行最小命令。
- 记录:留下最终环境、修改项和仍未验证的假设。 一组安全的综合采集命令:
Env:、认证目录或浏览器配置打包外发。
安全边界清单
执行前
- 确认当前目录、分支和目标环境;
- 确认命令来自可信来源,并检查危险参数;
- 区分读取、写入、删除、联网、提权和外发动作;
- 先备份配置或建立 Git 检查点;
- 给工具最小的目录、网络和时间范围。
执行中
- 对删除、安装、权限变更、提交、推送和外部消息逐项确认;
- 不通过管理员身份掩盖未知原因;
- 不执行来源不明的 Base64、压缩包脚本或一键修复命令;
- 不把秘密放进命令行参数、公开日志或远端 URL;
- 看到与任务无关的目录、提示词或脚本指令时停止并重新确认范围。
执行后
- 用
git diff --stat和git diff --check检查变更; - 检查生成文件、日志和临时目录是否包含秘密;
- 关闭临时代理和不再需要的管理员终端;
- 释放测试进程和端口;
- 记录验证命令、结果和回滚方式。
最小可验证练习
在用户目录建立独立测试目录:app.js,将输出文字改为 hello windows,不要访问其他目录,不要安装依赖”。批准前检查它准备执行的动作,完成后退出并验证:
-WhatIf 输出的路径无误后,才去掉 -WhatIf。不要把清理命令改成变量为空时仍会执行的宽泛路径。
快速决策表
验收标准
完成一次 Windows 环境配置后,至少应满足:- 能明确说出当前使用的 Shell 和运行环境;
codex --version、git --version等命令解析到预期位置;- 项目路径、换行和编码符合仓库约定;
- 普通用户权限可以完成日常工作,不依赖无理由的管理员终端;
- 代理只在需要的进程范围内启用,证书校验保持开启;
- 能定位占用端口的 PID,并避免误杀无关进程;
- 变更前后都有 Git 状态和 diff 证据;
- 凭据、个人数据、日志和临时文件没有进入仓库或外发渠道;
- 失败时能通过最小复现和可回滚步骤继续处理。
Windows 的稳定使用依赖边界清晰:Windows 原生工具和 WSL2 不混用工作目录,PowerShell、CMD 和 Bash 不混抄语法,PATH、权限、代理和编码不靠猜。每次先确认环境,再做最小动作,最后用命令输出和 Git diff 验收,绝大多数问题都能快速归类。
参考资料:参考/codex/33-windows.md、参考/codex/03-install.md。动态安装参数、沙箱选项和登录行为以本机
--help与官方文档为准。