Пакет: FOR / R не работает с переменной в пути - PullRequest
1 голос
/ 21 декабря 2011

Пример:

FOR %%i IN (3) DO (
    ECHO %%i
    FOR /R "C:\backup\server%%i\temp" %%? IN (*.bak) DO (
        REM some code...
    )
)

Результат ECHO: 3.

Результат секунды FOR: код не выполняется .

Но с:

FOR %%i IN (3) DO (
    ECHO %%i
    FOR /R "C:\backup\server3\temp" %%? IN (*.bak) DO (
        REM some code...
    )
)

Результат ECHO: 3.

Результат второго FOR: код выполняется .

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 21 декабря 2011

Единственное решение, которое я нашел:

FOR %%i IN (3) DO (
    PUSHD "C:\backup\server%%i\temp"
    FOR /R %%g IN (*.bak) DO (
        REM some code...
    )
    POPD
)

Документ: http://ss64.com/nt/for_r.html

Если путь [drive:] не указан, по умолчанию используется текущий диск: путь

.

Редактировать: Я добавил PUSHD / POPD после ответа на dbenham. Благодаря ему.

3 голосов
/ 22 декабря 2011

Причина, по которой оригинальный код не работает, заключается в том, что каталог для опции FOR / R должен быть известен во время синтаксического анализа FOR, но переменная %% i не раскрывается до после оператор FOR уже проанализирован.Та же проблема существует для предложения adarshr -! Суффикс!не раскрывается до тех пор, пока не будет проанализирован оператор FOR.

Ответ GG - очень хороший жизнеспособный обходной путь.Возможно, можно было бы улучшить PUSHD, а затем POPD вместо CD.Но только в случае необходимости.

Единственный другой способ обойти проблему - это что-то вроде этого

@echo off
FOR %%i IN (3) DO call :innerLoop %%i
exit /b

:innerLoop
FOR /R "C:\backup\server%1\temp" %%? IN (*.bak) DO (
  REM some code...
)
exit /b

Но я не люблю использовать CALL, если не обязан, потому чтоэто неэффективно.Мне нравится CD решение.

1 голос
/ 14 ноября 2014

For / f всегда более гибкий, чем FOR / R, например:

FOR %%i IN (3) DO (
   FOR /f "delims=" %%? IN ('DIR /s/b "C:\server%%i\*.bak"')  DO (
      ECHO %%?
   )
)

Выход:

C: \ server3 \ 1.bak

C: \ server3 \ подпапке \ 2.bak

Кроме того, для рекурсивного поиска более одного типа файлов:

FOR %%i IN (3) DO (
   FOR /f "delims=" %%? IN ('DIR /s/b "C:\server%%i\*.bak","C:\server%%i\*.htm"')  DO (
      ECHO %%?
   )
)

Выход:

C: \ server3 \ 1.bak

C: \ server3 \ подпапке \ 2.bak

C: \ server3 \ подпапка \ 1.htm

1 голос
/ 21 декабря 2011

Разве вы не должны устанавливать EnableDelayedExpansion на?

SETLOCAL ENABLEDELAYEDEXPANSION

FOR %%i IN (3) DO (
    SET suffix=%%i
    ECHO !suffix!
    FOR /R "C:\backup\server!suffix!\temp" %%? IN (*.bak) DO (
        REM some code...
    )
)
...