2010-02-24 2 views
0
test.cmd

файла:Отображение строки из текстового файла в пакетном файле

name=dummy 

for /f "eol=; tokens=1 delims=," %%i in (list.txt) do ( 
echo i: %%i 
set name=%%i 
echo name: %name%) 

файл list.txt содержит эти строки (одна имя в строке):

John 
Tom 
Erica 
Sara 

Каждый время я запускаю эту партию. Я получаю этот выход:

i: John 
name: dummy 
i:T om 
name: dummy 
i: Erica 
name: dummy 
i: Sara 
name: dummy 

Кажется, что переменная не может быть присвоено значение %%i

Любая идея?

ответ

1

Вы попадаете в старую ловушку, не используя отложенное расширение.

Для быстрого решения, просто положить

setlocal enabledelayedexpansion 

до этого цикла в пакетный файл и использовать !name! вместо %name%.

CMD расширяет переменные при разборе команды. Команда в этом смысле - это одна строка или «блок», ограниченная круглыми скобками. Полный цикл for анализируется только один раз и на этом этапе %name% заменяется на значение, имеющееся в этой точке, а именно "dummy". Отложенное расширение, с другой стороны, использует ! вместо %, чтобы разграничить имена переменных и переменные, а затем развернуть их прямо перед выполнением команды.

Всякий раз, когда вы устанавливаете переменную в скобках в скобках и, используйте ее значение в том же блоке снова, вам нужно использовать отложенное расширение. help set имеет также некоторую информацию об этом:

отложенной переменной среды расширение полезно для получения вокруг ограничений текущего расширения , которое происходит, когда строка текста для чтения, а не при ее выполнении. Следующий пример демонстрирует проблемы с немедленным переменной расширения:

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "%VAR%" == "after" @echo If you see this, it worked 
) 

никогда не будет отображать сообщение, так как в %VAR% в обаIF заявления является замещен, когда считывается первый IF заявление, так как он логически включает в себя тело IF, то есть составной оператор. Таким образом, IF внутри составного оператора действительно сравнивает «до» с «после» , который никогда не будет равным.Точно так же, следующий пример не будет работать, как ожидалось:

set LIST= 
for %i in (*) do set LIST=%LIST% %i 
echo %LIST% 

в том, что он будет не создать список файлов в текущем каталоге, но вместо этого будет просто установить переменную LIST в последний найденный файл. Опять же, это происходит потому, что %LIST% является расширен только один раз, когда FOR заявление читается, и в то время переменная LIST пуста. Таким образом, цикл фактическое FOR мы выполняем это:

for %i in (*) do set LIST= %i 

который просто хранит настройки LIST в последнего найденного файла. переменная

отложенной среды расширение позволяет использовать различный характера (восклицательный знак), чтобы переменных окружения в время выполнения. Если задержка переменной расширение включено, вышеуказанные примеры можно записать следующим образом работать как задумано:

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "!VAR!" == "after" @echo If you see this, it worked 
) 

set LIST= 
for %i in (*) do set LIST=!LIST! %i 
echo %LIST% 
+0

Большое спасибо! Ты определенно спас мне мой день. fabio vitale –