使用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.
)
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮忙吗?
use*_*328 14
要获得相对路径,您可以使用变量替换和延迟扩展,如下所示:
setlocal enabledelayedexpansion
for /R . %%f in (*) do (
set B=%%f
echo Relative !B:%CD%\=!
)
Run Code Online (Sandbox Code Playgroud)
我在这里使用当前目录(%CD%)作为根目录.
我不确定你想要完成什么,但至少这会给你一个很好的起点:
@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.
)
Run Code Online (Sandbox Code Playgroud)
由于您正在修改循环中的变量,因此需要告诉命令解释程序您希望允许变量"延迟扩展".这就是setlocal enabledelayedexpansion它的用途.然后您可以使用!var定界符代替%,并且这样写的变量将在运行时扩展.这是必要的,因为for-loop将被调用,就像它是1次单独调用一样(当你遗漏时可以看到这个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""
)
Run Code Online (Sandbox Code Playgroud)