文章目录
- 解决PATH变量污染的问题
- 概述
- 笔记
- 清空PATH变量之后的系统设置
- 在命令行查看清空后的PATH变量
- 以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例
- 以系统命令 where为例
- 备注 - 批处理的后缀最好是bat
- END
解决PATH变量污染的问题
概述
随着不断安装新软件, 可能多个软件中都有一个同名的被公用的程序。这些同名软件的版本可能并不相同。
不同软件对于公用的程序(e.g. cmake, perl,openssl)的版本要求可能并不一样。
这时, 运行目标软件之前,可能就要调整PATH变量中的条目顺序。否则就可能引起程序运行失败或异常。
还有个问题,PATH变量的最大长度是有限制的。最后可能装不下,导致手工编辑调整PATH变量顺序变得不可能。
虽然有替代方法(e.g. 再整几个环境变量e.g. my_env1, my_env2…, 将路径放进去, 然后将%my_env1%;%my_env2%;放入PATH, 这样PATH变量本身的长度就短了), 这样也不太好, 很乱。
我想到的方法, 直接将PATH变量清空。 自己启动程序时, 写一个.bat, 将目标程序运行的环境变量赋值给PATH, 然后再call目标程序。
这样可以从根子上解决PATH变量污染的问题。
唯一不好的一点是, 目标软件需要啥, 咱不清楚(大概率不清楚), 需要依据软件报错, 才能知道这个软件需要啥PATH变量。
笔记
清空PATH变量之后的系统设置
在命令行查看清空后的PATH变量
C:\Users\me>echo %path%
%path% // 可以看到, 打印不出有效的path变量的值
C:\Users\me>path
PATH=(null) // 可以看到, PATH变量是空的
C:\Users\me>
以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例
直接运行,会报错, 看报错信息, 知道需要git for windows.
那么就将git的目录加进去(可以事先备份一下自己的原始PATH, 然后根据软件的提示, 从开始菜单中确定是哪个程序, 然后确定程序路径, 再结合备份的原始PATH, 就可以知道该软件需要的依赖程序的PATH路径)。
set PATH=C:\Program Files\Git\cmd;%PATH%
call gitea-1.17.1-gogit-windows-4.0-amd64.exe
调用自己写的bat, 就可以将目标软件正常运行起来。
E:\git_rep_local>run_my_gittea.bat
E:\git_rep_local>set PATH=C:\Program Files\Git\cmd;
E:\git_rep_local>call gitea-1.17.1-gogit-windows-4.0-amd64.exe
2024/03/28 09:25:46 cmd/web.go:106:runWeb() [I] Starting Gitea on PID: 42880
2024/03/28 09:25:46 ...s/setting/setting.go:594:deprecatedSetting() [E] Deprecated fallback `[server]` `LFS_CONTENT_PATH` present. Use `[lfs]` `PATH` instead. This fallback will be removed in v1.18.0
2024/03/28 09:25:46 ...etting/repository.go:290:newRepository() [W] SCRIPT_TYPE "bash" is not on the current PATH. Are
// ...
2024/03/28 09:25:47 ...xer/stats/indexer.go:85:populateRepoIndexer() [I] Done (re)populating the repo stats indexer with existing repositories
2024/03/28 09:25:47 cmd/web.go:217:listen() [I] [6604c71b-37] Listen: http://0.0.0.0:3000
2024/03/28 09:25:47 cmd/web.go:221:listen() [I] [6604c71b-37] AppURL(ROOT_URL): http://localhost:3000/
2024/03/28 09:25:47 cmd/web.go:224:listen() [I] [6604c71b-37] LFS server enabled
2024/03/28 09:25:47 ...s/graceful/server.go:61:NewServer() [I] [6604c71b-37] Starting new Web server: tcp:0.0.0.0:3000 on PID: 42880
// 到此, 自己的gitea已经正常运行起来了。
以系统命令 where为例
因为没有PATH环境变量了,直接打开cmd, 会找不到where命令。
C:\Users\me>where
'where' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
这时, 可以自己写个bat,将需要的PATH值加上, 就可以正常调用系统中的命令。
set PATH=C:\Windows\System32;
call cmd
双击自己的bat或者在cmd命令行中手工运行自己的bat都是一样的。
Microsoft Windows [版本 10.0.19045.3570]
(c) Microsoft Corporation。保留所有权利。
C:\Users\me>cd /d D:\my_dev\cmd_env
D:\my_dev\cmd_env>dir
驱动器 D 中的卷没有标签。
卷的序列号是 36AD-51CE
D:\my_dev\cmd_env 的目录
2024/03/28 10:06 <DIR> .
2024/03/28 10:06 <DIR> ..
2024/03/27 16:36 41 x64_cmd.bat
1 个文件 41 字节
2 个目录 438,445,146,112 可用字节
D:\my_dev\cmd_env>x64_cmd.bat
D:\my_dev\cmd_env>set PATH=C:\Windows\System32;
D:\my_dev\cmd_env>call cmd
Microsoft Windows [版本 10.0.19045.3570]
(c) Microsoft Corporation。保留所有权利。
D:\my_dev\cmd_env>where /?
WHERE [/R dir] [/Q] [/F] [/T] pattern...
描述:
显示符合搜索模式的文件位置。在默认情况下,搜索是在当前目录和 PATH
环境变量指定的路径中执行的。
参数列表:
/R 从指定目录开始,递归性搜索并显示符合指定模式的文件。
/Q 只返回退出代码,不显示匹配文件列表。(安静模式)
匹配文件。(安静模式)
/F 显示所有相配文件并用双引号括上。
/T 显示所有相配文件的文件的文件。
pattern 指定要匹配的文件的搜索模式。通配符 * 和 ? 可以用在模式中。
也可以指定 "$env:pattern" 和 "path:pattern" 格式; 其中
"env" 是环境变量,搜索是在 "env" 变量的指定的路径中执行的。
这些格式不应该跟 /R 一起使用。此搜索也可以用将 PATHEXT 变
量扩展名附加于此模式的方式完成。
/? 显示此帮助消息。
注意: 如果搜索成功,此工具返回错误级别 0; 如果不成功,返回 1; 如果失
败或发生错误,返回 2。
示例:
WHERE /?
WHERE myfilename1 myfile????.*
WHERE $windir:*.*
WHERE /R c:\windows *.exe *.dll *.bat
WHERE /Q ??.???
WHERE "c:\windows;c:\windows\system32:*.dll"
WHERE /F /T *.dll
D:\my_dev\cmd_env>
// 可以看到, where命令可以正常运行了
备注 - 批处理的后缀最好是bat
看pathext变量
C:\Users\me>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW;.RB;.RBW
可知,如果是可执行程序, 那么文件后缀名称的优先级顺序为 .COM > .EXE > .BAT > .CMD
所以,如果要写批处理, 最好后缀名为.bat, 这样比.cmd优先级高一些