Почему «для» не работает внутри командного файла?(Работает нормально снаружи) - PullRequest
2 голосов
/ 27 августа 2011
for /F "tokens=*" %* in (Test.txt) do md ".\%*" & cd "%*" & md "Something1" & md "Something2" & cd ".."

Команда DOS извлекает имена из текстового файла и создает именованную папку, а затем две подпапки.

Apple
-Something1
-Something2

Но когда я помещаю его в командный файл следующим образом:

@ECHO OFF
@for /F "tokens=*" %* in (Test.txt) do md ".\%*" & cd "%*" & md "Something1" & md "Something2" & cd ".."
ECHO Done
PAUSE

Затем запустите его из Windows GUI, появится экран, закроется и ничего не сделает. Даже если я создаю пакет с рабочей командой DOS, он ничего не делает. Чего мне не хватает?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 27 августа 2011

В пакетных файлах вам нужно удвоить '%' в переменной for. Не спрашивай меня почему. :)

2 голосов
/ 27 августа 2011

У меня этот вариант работает:

setlocal enabledelayedexpansion
for /F "tokens=*" %%g in ('type foo.txt') do (
                md ".\%%g"
                cd "%%g"
                md "Something1"
                md "Something2"
                cd ".."
        )
endlocal

Я решил поместить серию команд между скобками и одной в строку. Ваша цепочка & разделенных команд также должна работать.

Блок setlocal / endlocal ограничивает область видимости переменных. Аргумент enabledelayedexpansion включает некоторые дополнительные функции в cmd. Обычно это не требуется, потому что это значение по умолчанию для CMD, но это значение могло быть изменено с помощью политики, поэтому рекомендуется включить его.

Я предпочитаю использовать pushd / popd вместо cd blah / cd .. в скриптах. Я думаю, что это более надежно.

...