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

Eug*_*ene 3 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.
)
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%)作为根目录.


Bar*_*art 6

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

@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)