遇到的问题
实现1 使用find命令
获取当前文件所在的目录
在path环境变量中查找当前目录路径
根据查找结果处理
添加当前目录路径到path系统环境变量中 不重复添加
实现2 使用for命令
批处理 for命令 增加 一个系统path环境变量
拓展
批处理 for命令 遍历 系统path环境变量
批处理 for命令 查找 一个系统path环境变量
批处理 for命令 删除 一个系统path环境变量
参考资料
问题描述
我想点击运行一个批处理文件(install.bat),然后把该文件所在的目录配置到path系统环境变量中。
这种功能我用在软件安装程序中,为自己的软件自动搭建好需要的环境。
遇到的问题
追加一个路径到永久的path系统环境变量中,可以通过setx /m "path" "%newpath%;%path%"
命令来实现,但是我可能运行多次intall.bat
,这样就会造成intall.bat会写入多个相同的路径到path环境变量中
。要解决这个问题,就需要在追加新路径到path环境变量之前,先检查path环境变量中是否已经存在了该路径,如果有了该路径,那我就不需要再添加。如果没有我再添加。不能一直无脑的添加。
实现1 使用find命令
获取当前文件所在的目录
批处理中%0
变量表示当前的批处理文件,%~dp0
则表示当前文件的绝对路径.1
2
3
4
5::获取当前文件所在的目录的绝对路径
set "thispath=%~dp0"
::删除之后的路径分隔符号“\”
set "thispath=%thispath:~0,-1%"
echo 当前文件所在目录路径:%thispath%
在path环境变量中查找当前目录路径
这里使用find命令来实现查找,但是find命令好像只能在文件中查找字符串,不能再字符串中查找子串,所以我们要先把path环境变量先写到一个临时文件中,然后再在临时文件中查找。1
2
3
4
5
6::读取path环境变量到自定义变量中
set mypath=%path%
::把path环境变量写入临时文件中,以备后续使用findstr命令进行查找
echo %mypath% > temp.txt
::在临时文件中查找有没有当前路径
find "%thispath%" temp.txt
根据查找结果处理
批处理命令都有程序返回码errorlevel
,对于find命令,如果在文件中查找到则返回0
,如果没有找到则返回1
,返回的结果就保存在程序返回码errorlevel
中。所以我们可以根据程序返回码来做响应的条件处理:1
2
3
4
5
6
7
8
9if %errorlevel% == 0 (
echo path环境变量中 已经包含了 当前路径%thispath%
echo 程序返回码:%errorlevel%
) else (
echo path环境变量中 没有包含 当前路径%thispath%
echo 程序返回码:%errorlevel%
::追加当前文件所在目录的路径到path环境变量中
setx /m "path" "%thispath%;%path%"
)
设置好环境变量后,删除临时文件即可,完整的代码如下:
添加当前目录路径到path系统环境变量中 不重复添加
install.bat:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25@echo off
::获取当前文件所在的目录的绝对路径
set "thispath=%~dp0"
::删除之后的路径分隔符号“\”
set "thispath=%thispath:~0,-1%"
echo 当前文件所在的目录的绝对路径:%thispath%
::读取path环境变量到自定义变量中
set mypath=%path%
::把path环境变量写入临时文件中,以备后续使用findstr命令进行查找
echo %mypath% > temp.txt
::在临时文件中查找有没有当前路径
find "%thispath%" temp.txt
::如果查找到则fin命令返回0,如果没有找到find命令返回1
if %errorlevel% == 0 (
echo path环境变量中 已经包含了 当前路径%thispath%
echo 程序返回码:%errorlevel%
) else (
echo path环境变量中 没有包含 当前路径%thispath%
echo 程序返回码:%errorlevel%
::追加当前文件所在目录的路径到path环境变量中
setx /m "path" "%thispath%;%path%"
)
::删除临时文件
del temp.txt
pause
还有要注意的是setx /m "path" "%thispath%;%path%"
命令需要管理员权限,所以要以管理员身份运行该批处理脚本。
实现2 使用for命令
批处理 for命令 增加 一个系统path环境变量
1 | @echo off |
拓展
批处理 for命令 遍历 系统path环境变量
1 | @echo off |
运行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22D:\dev\workspace\MarkdownTools
D:\dev\workspace\HexoTools\runable
D:\dev\workspace\BaiduTranslatorPronunciationGenerator\runable
C:\Windows
C:\windows\system32
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Windows\System32\OpenSSH\
D:\快捷方式
D:\dev\java\jdk1.8.0_91\bin
F:\Program Files\nodejs\node_global
F:\Program Files\nodejs\
F:\Program Files\Git\bin
D:\dev\apache-maven-3.5.4\bin
C:\Program Files\Microsoft VS Code\bin
D:\MinGW\bin
D:\dev\apache-tomcat-8.5.35\bin
D:\dev\java\my\runable\openwith
D:\GitHub\latex
F:\texlive\2018\texlive\2018\bin\win32
D:\GitHub\MD
请按任意键继续. . .
批处理 for命令 查找 一个系统path环境变量
1 | @echo off |
运行结果:1
2
3
4
5
6
7D:\dev\workspace\MarkdownTools;D:\dev\workspace\HexoTools\runable;D:\dev\workspace\BaiduTranslatorPronunciationGenerator\runable;C:\Windows;C:\windows\sy
stem32;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\快捷方式;D:\dev\java\jdk1.8.0_91\bin;F:\Progr
am Files\nodejs\node_global;F:\Program Files\nodejs\;F:\Program Files\Git\bin;D:\dev\apache-maven-3.5.4\bin;C:\Program Files\Microsoft VS Code\bin;D:\Min
GW\bin;D:\dev\apache-tomcat-8.5.35\bin;D:\dev\java\my\runable\openwith;D:\GitHub\latex;F:\texlive\2018\texlive\2018\bin\win32;D:\GitHub\MD;
找到:D:\dev\workspace\MarkdownTools
请按任意键继续. . .
批处理 for命令 删除 一个系统path环境变量
1 | @echo off |