Skip to main content

获取当前路径的父目录

在实际开发过程中, 相对路径是经常要使用的, 但是考虑到 ../../ 这种方式有个弊端: 不好记录当前所处的位置. 因此我们在脚本中, 预先获取指定深度的父级目录, 利用绝对路径的思路, 去代替相对路径

获取三级父目录

可以获取当前路径的三级父目录 并将其存储在

  • 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_pathparent_two_pathparent_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次,每次获取上一级父目录