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