Cmd: не оценивать переменные внутри цикла

пытаюсь сделать .bat скрипт, и нужно, чтобы некоторые строки работали правильно.

это то, что у меня есть до сих пор

@echo off
for /r %%i in (*.csv) do (
set str=%%i
set str=%str:csv=rar%
echo %%i
echo.%str%
)

скажем, у меня это работает в C:\, и есть 5 csv, 1.csv, 2.csv... 5.csv

первый раз, когда я запускаю его, я получаю выход:

C:.csv

C:.csv

C:.csv

C:.csv

C:.csv

во второй раз я получаю:

C:.csv
csv=rar
C:.csv
csv=rar
C:.csv
csv=rar
C:.csv
csv=rar
C:.csv

затем все последующие звонки я получаю:

C:.csv
rar=rar
C:.csv
rar=rar
C:.csv
rar=rar
C:.csv
rar=rar
C:.csv

когда то, что я ожидал бы получить, прямо через:

C:.csv
C:.rar
C:.csv
C:.rar
C:.csv
C:.rar
C:.csv
C:.rar
C:.csv
C:.rar

поэтому я удаляю замену:

@echo off
for /r %%i in (*.csv) do (
echo %%i
set str=%%i
echo.%str%
)

первый запуск:

C:.csv

C:.csv

C:.csv

C:.csv

C:.csv

Второй:

C:.csv
C:.csv
C:.csv
C:.csv
C:.csv
C:.csv
C:.csv
C:.csv
C:.csv
C:.csv

это похоже на то, что он не установил переменную str до последнего запуска цикла, даже если он пытается эхо из переменной, строка которой происходит после настройки, а затем сохранил это для следующего цикла? Есть ли что-то, что мне не хватает на пути его циклов обработки?

спасибо

1 ответов


вы должны использовать setlocal enabledelayedexpansion. На самом деле, содержание %str:csv=rar% оценивается только один раз перед запуском цикла. Итак:

@echo off
setlocal enabledelayedexpansion
for /r %%I in (*.csv) do (
set str=%%i
set str=!str:csv=rar!
echo %%i
echo.!str!
)
endlocal