使用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.
)
有人可以帮忙吗?
答案 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""
)