Странный вопрос про пакетный файл windows - PullRequest
2 голосов
/ 18 марта 2011

Я получил 1.txt и 2.txt в моем рабочем каталоге.Я использую следующую партию, чтобы перечислить все файлы.

Пакет такой:

@echo off
for /f "tokens=*" %%a in ('dir *.txt /b') do (
    echo ---------------
    set file_variable=%%a
    echo file_variable=%file_variable%
    echo filename=%%a
    )    

Результат ниже:

---------------
file_variable=2.txt   <---------------why it is not 1.txt here??
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt

Спасибо.

Ответы [ 2 ]

6 голосов
/ 18 марта 2011

Вам нужно поставить:

@setlocal enableextensions enabledelayedexpansion

вверху вашего файла и

endlocal

в конце.

Тогда вам нужно использовать символы подстановки с отложенным расширением.

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=*" %%a in ('dir *.txt /b') do (
    echo ---------------
    set file_variable=%%a
    echo file_variable=!file_variable!
    echo filename=%%a
)
endlocal

C:\Documents and Settings\Pax\My Documents> qq.cmd
---------------
file_variable=1.txt
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt

То, что вы видите без отложенного расширения, - это то, что весь цикл for проверяется перед запуском. Это включает подстановку, так что %file_variable% будет заменено значением, которое он удерживал до цикла. Использование отложенного расширения откладывает оценку до тех пор, пока не будет выполнена фактическая строка.


На сайте есть множество замечательных трюков для сценариев Windows Роба ван дер Вуде, содержащих множество различных способов работы с Windows с помощью различных инструментов.

1 голос
/ 18 марта 2011

В этом конкретном случае вы можете получить правильный вывод, если вы ECHOed file_variable, например:

CALL ECHO file_variable=%%file_variable%%

Этот подход менее гибкий и, вероятно, менее производительный, чем описанный в @ paxdiablo ответ.Вероятно, это простой и быстрый метод задержки раскрытия переменной без необходимости включения специального синтаксиса для этого.

...