批量编程 - 获取文件的相对路径

时间:2011-12-13 10:18:37

标签: batch-file

使用DOS批处理,我希望以递归方式循环遍历目录并读取完整文件路径,并获取该文件的相对路径。例如,位于" D:\ foo \ bar \ a \ b \ file.txt"将获得相对路径:" \ bar \ a \ b \"

现在我使用此代码并且无效

FOR /R D:\Download\758_DATA\ %%F IN (*) DO (
    SET B = %%~pF
    Set B=%B:~-6%  ::take substring of the path
    ECHO.%B%
    ECHO %%F 
    ECHO.
)

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:11)

要获得相对路径,您可以将变量替换与延迟扩展一起使用,如下所示:

setlocal enabledelayedexpansion
for /R . %%f in (*) do (
  set B=%%f
  echo Relative !B:%CD%\=!
)

我在这里使用当前目录(%CD%)作为根目录。

答案 1 :(得分:5)

我不确定你想要完成什么,但至少这会给你一个很好的起点:

@echo off & setlocal enabledelayedexpansion

set rootdir=D:\download

for /R %rootdir% %%F in (*) do (
    set B=%%~pF
    ::take substring of the path
    set B=!B:~0,-6!
    echo Full   : %%F 
    echo Partial: !B!
    echo.
)

由于您正在修改循环中的变量,因此您需要告诉命令解释器您希望允许变量“延迟扩展”。这就是setlocal enabledelayedexpansion的用途。然后,您可以使用!作为var分隔符而不是%,并且将在运行时扩展这样写的变量。这是必要的,因为for - 循环将被调用,就像它是一次调用一样(当你忽略echo off时可以看到这一点)

修改:修改后的示例包括自动切断:

@echo off & setlocal enabledelayedexpansion

set rootdir=%~f1
set foo=%rootdir%
set cut=
:loop
if not "!foo!"=="" (
    set /a cut += 1
    set foo=!foo:~1!
    goto :loop
)
echo Root dir: %rootdir%
echo strlen  : %cut%

:: also remove leading /
set /a cut += 1

for /R %rootdir% %%F in (*) do (
    set B=%%~fF
    ::take substring of the path
    set B=!B:~%cut%!
    echo Full    : %%F 
    echo Partial : !B!
    echo""
)