Cmd: не оценивать переменные внутри цикла - PullRequest
6 голосов
/ 21 октября 2010

пытается создать скрипт .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:\1.csv

C:\2.csv

C:\3.csv

C:\4.csv

C:\5.csv

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

C:\1.csv
csv=rar
C:\2.csv
csv=rar
C:\3.csv
csv=rar
C:\4.csv
csv=rar
C:\5.csv

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

C:\1.csv
rar=rar
C:\2.csv
rar=rar
C:\3.csv
rar=rar
C:\4.csv
rar=rar
C:\5.csv

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

C:\1.csv
C:\1.rar
C:\2.csv
C:\2.rar
C:\3.csv
C:\3.rar
C:\4.csv
C:\4.rar
C:\5.csv
C:\5.rar

Поэтому я удаляю подстановку:

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

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

C:\1.csv

C:\2.csv

C:\3.csv

C:\4.csv

C:\5.csv

Второй запуск:

C:\1.csv
C:\5.csv
C:\2.csv
C:\5.csv
C:\3.csv
C:\5.csv
C:\4.csv
C:\5.csv
C:\5.csv
C:\5.csv

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

Спасибо

1 Ответ

11 голосов
/ 21 октября 2010

Вы должны использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...