02 · 操作系统 · Windows
环境变量与 PATH(Windows)
本篇你将学到
- 环境变量是什么,PATH 有什么用
- 为什么会出现“无法将……识别为 cmdlet……”
- 怎么查看、临时修改、永久修改
- 改完为什么要新开一个窗口
环境变量:电脑的“便利贴”
环境变量就像贴在电脑上的一张张便利贴,每张写着“名字 = 内容”,比如 USERNAME = xiaoming、TEMP = C:\Users\xiaoming\AppData\Local\Temp。系统和程序需要某个信息时,就来看一眼对应的便利贴[1]。
它的内容都是文字。一个程序启动另一个程序时,会把自己的整套便利贴抄一份给它[1]。所以在 PowerShell 窗口里打开的程序,看到的是这个窗口的那一套。
PATH:去哪些文件夹找命令
最重要的一张便利贴叫 PATH(Windows 上常写成 Path,名字不分大小写)。它是一串文件夹列表,用分号 ; 隔开[1]:
C:\Windows\system32;C:\Windows;C:\Users\xiaoming\AppData\Local\Microsoft\WindowsApps
你输入 notepad 回车时,系统就按这张列表,从左到右一个个文件夹去找有没有叫 notepad 的可执行程序[1]。哪些扩展名算“可执行”,由另一个变量 PATHEXT 决定,比如 .EXE、.BAT[1]。
像通讯录:你说“打给小明”,手机去通讯录里找号码;通讯录里没有,就打不出去。程序明明在电脑上,但它所在的文件夹不在 PATH 里,PowerShell 就会报错:
hello : 无法将“hello”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
解决办法有两个:写出完整路径(C:\Tools\hello.exe),或者把 C:\Tools 这个文件夹加进 PATH。注意加的是程序所在的文件夹,不是程序文件本身。
三层便利贴:系统、用户、当前窗口
Windows 的环境变量分三层[1]:
| 层 | 管谁 | 存在哪 |
|---|---|---|
| 系统(Machine) | 这台电脑上的所有用户 | 保存下来,重启也在 |
| 用户(User) | 只管你自己 | 保存下来,重启也在 |
| 进程(当前窗口) | 只管这一个窗口 | 窗口关掉就没了 |
每个新窗口启动时,会把“系统”和“用户”两层合起来,得到自己的那一份[1]。所以你看到的 Path,是系统 Path 后面接上用户 Path。
在 PowerShell 里查看
$env:Path # 看 Path 的内容
$env:Path -split ';' # 一行一个,好读一些
$env:USERNAME # 看某一个变量
Get-ChildItem Env: # 列出全部环境变量
这些写法都来自微软的 PowerShell 文档[1]。
临时设置:只管当前窗口
$env:Path += ';C:\Tools'
+= 的意思是“在后面追加”,前面的分号用来和原来的内容隔开[1]。在 PowerShell 里这样改,只影响当前这个窗口[1],关掉窗口就恢复原样。适合临时试一下。
千万别写成
$env:Path = 'C:\Tools':一个=是整个换掉,系统文件夹都没了,很多命令会突然找不到。真写错了也别慌,关掉窗口重新打开就恢复了。
永久设置:用“环境变量”窗口(推荐)
- 打开“设置 → 系统 → 系统信息”,点“高级系统设置”(也可以在开始菜单里搜“编辑系统环境变量”);
- 在“系统属性”窗口的“高级”选项卡里,点“环境变量(N)…”[1];
- 上半部分是用户变量,下半部分是系统变量。只给自己用,就改上面的:选中
Path,点“编辑”; - 点“新建”,输入
C:\Tools,点“确定”;回到“环境变量”窗口,**再点一次“确定”**才算保存。
Windows 会把这些值写进注册表,以后每次开机都在[1]。系统变量会影响所有用户,改它需要管理员权限[1],没有必要就别动。
改完要新开窗口:已经开着的 PowerShell、VS Code 等程序,在启动时就“抄”好了一份旧的环境变量,不会自动更新。关掉重新打开,才能读到新的 Path。
也可以用命令改(了解即可)
- PowerShell 写法:
[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'User'),第三个参数写'User'或'Machine',表示存进哪一层[1]。 - 网上常见的
setx命令也能永久保存,但有两个坑:它设的值只对以后新开的窗口有效,当前窗口不变[2];值超过 1024 个字符会被截断,截断后的内容会覆盖原来的变量,可能把原来的数据弄丢[2]。Path 往往很长,所以改 Path 不建议用 setx,用上面的图形窗口最稳妥。
动手模拟
**第一步:临时修改。**在模拟的 PowerShell 里,先感受“找不到”,再临时加进 PATH,然后新开窗口看看它是不是又没了:
可以直接打字,也可以点上面的命令按钮把命令填进去,再按回车(或点“运行”)。↑ 键翻出上一条命令。“新开一个终端窗口”会像真的一样重新开始:临时设置会消失,配置文件和历史记录会保留。输入 help 看看支持哪些命令。
**第二步:永久修改。**在模拟的“环境变量”窗口里把 C:\Tools 加进用户 Path 并保存,再分别在“原来的窗口”和“新开的窗口”里测试。保存以后,回到上面的终端点“新开一个终端窗口”,hello 也能直接运行了。
🧪 测试:在 PowerShell 里运行 hello
界面为示意,参考 Windows 11 的“系统属性 → 高级 → 环境变量”,真实界面会随版本略有不同。
小结
- 环境变量是“名字 = 内容”的便利贴;PATH 是“去哪些文件夹找命令”的列表,分号隔开,从左到右找。
- 看:
$env:Path -split ';';临时加:$env:Path += ';C:\Tools'(只管当前窗口)。 - 永久改:设置 → 系统 → 系统信息 → 高级系统设置 → 环境变量,改用户 Path,记得点两次“确定”。
- 改完新开窗口才生效;改 Path 别用 setx。
用 Mac、Linux 的同学:同样的概念在 02-15(zsh)和 02-23(bash)里讲。
参考资料
- [1]about_Environment_Variables · Microsoft Learn(PowerShell)
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables - [2]setx · Microsoft Learn(Windows Commands)
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/setx