пакетное программирование - получить относительный путь к файлу - PullRequest
3 голосов
/ 13 декабря 2011

Используя пакет 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 ]

11 голосов
/ 15 августа 2012

Чтобы получить относительные пути, вы можете использовать подстановку переменных вместе с отложенным расширением, например:

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

Я использую текущий каталог (% CD%) в качестве корневого каталога здесь.

5 голосов
/ 13 декабря 2011

Я не уверен, чего вы хотите достичь, но по крайней мере это даст вам хорошую отправную точку:

@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. Затем вы можете использовать ! в качестве разделителя переменных вместо %, и переменные, записанные как таковые, будут расширены во время выполнения. Это необходимо, потому что 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""
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...