获取当前路径的父目录
在实际开发过程中, 相对路径是经常要使用的, 但是考虑到 ../../
这种方式有个弊端: 不好记录当前所处的位置
. 因此我们在脚本中, 预先获取指定深度的父级目录, 利用绝对路径的思路, 去代替相对路径
获取三级父目录
可以获取当前路径的三级父目录 并将其存储在
parent_one_path
parent_two_path
parent_three_path
@echo off
setlocal enabledelayedexpansion
set CurrentPath=%~dp0
set parent_one_path=
set parent_two_path=
set parent_three_path=
:begin
for /f "tokens=1,* delims=\" %%i in ("%CurrentPath%") do (
set content=%%i
set CurrentPath=%%j
)
if "%parent_one_path%%content%\" == "%~dp0" goto end
set parent_three_path=%parent_two_path%
set parent_two_path=%parent_one_path%
set parent_one_path=%parent_one_path%%content%\
goto begin
:end
echo Parent One Path: %parent_one_path%
echo Parent Two Path: %parent_two_path%
echo Parent Three Path: %parent_three_path%
pause exit
@echo off
- 关闭log@echo on
- 开启log%~dp0
- 是一个批处理脚本中的特殊语法,用于获取当前批处理文件的路径和驱动器。具体来说:%~d0
- 获取当前批处理文件的驱动器(例如C:
)%~p0
- 获取当前批处理文件的路径(不包括驱动器)%~dp0
- 组合获取当前批处理文件的完整路径(包括驱动器和路径)
setlocal enabledelayedexpansion
- 启用延迟变量扩展,以便在循环中正确处理变量set CurrentPath=%~dp0
- 获取当前批处理文件的路径for /f "tokens=1,\* delims=\" %%i in ("%CurrentPath%") do (...)
- 使用
for
循环将路径按\
分割 %%i
是当前路径的第一个部分%%j
是剩余部分
- 使用
set content=%%i
- 将当前路径的第一个部分存储在content
变量中set CurrentPath=%%j
- 将剩余部分存储在CurrentPath
变量中if "%parent_one_path%%content%\" == "%~dp0" goto end
- 如果当前路径的第一个部分加上parent_one_path
等于当前批处理文件的路径,则跳转到end
标签set parent_three_path=%parent_two_path%
- 将parent_two_path
的值赋给parent_three_path
set parent_two_path=%parent_one_path%
- 将parent_one_path
的值赋给parent_two_path
set parent_one_path=%parent_one_path%%content%\
- 将parent_one_path
加上当前路径的第一个部分,并加上\
goto begin
- 跳转到begin
标签,继续循环:end
: 结束循环, 并输出parent_one_path
、parent_two_path
和parent_three_path
的值pause exit
- 暂停窗口, 按下任意键退出
测试结果
获取第五级父目录
@echo off
setlocal enabledelayedexpansion
set CurrentPath=%~dp0
set parent_path=%CurrentPath%
for /L %%i in (1,1,5) do (
for /f "tokens=1,* delims=\" %%a in ("%parent_path%") do (
set parent_path=%%b
)
)
echo 5级父目录: %parent_path%
pause exit
for /L %%i in (1,1,5) do (...)
- 使用for
循环执行5次,每次获取上一级父目录