Я знаю, что это старый вопрос, но здесь есть некоторая дополнительная информация для тех, у кого похожая проблема ...
Ли, ваши рассуждения о том, почему "%% a" не работает вне цикла for, верны. Переменные% a-z и% A-Z (%% a-z внутри пакетного файла) являются конструкцией цикла for и не существуют вне его.
Я хотел бы порекомендовать альтернативное решение этой проблемы, которое соответствует правильным номерам строк (не пропускаются пустые строки) и не требует отложенного расширения, счетчиков или оператора goto. Взгляните на следующий код:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "c:\file_list.txt"') do if "%%a"=="%1" set line=%%b
echo.%line%
Вот что привело меня к вышеуказанным изменениям. Допустим, у вас было следующее содержимое файла:
Some text on line 1
Blah blah blah
More text
Первым делом я изменил (c: \ file_list.txt) .to ('findstr / n. * "C: \ file_list.txt"') .
- ' findstr / n. * "PATH \ FILENAME" ' читает файл и добавляет номер строки (' / n ') к каждой строке ('. * '- это регулярное выражение, соответствующее «0 или более» любого символа). Поскольку каждая строка теперь будет иметь номер строки в начале (даже пустые), цикл for не будет пропускать ни одной строки.
Каждая строка теперь будет выглядеть внутри цикла for:
1:Some text on line 1
2:Blah blah blah
3:More text
Далее мы используем "tokens = 1 * delims =:" , чтобы разбить номер строки и содержимое.
- ' tokens = 1 *' устанавливает первый токен (сохраненный в %% a ) для всего перед разделителем и второй токен (сохраненный в %%) b ) ко всему после него.
- ' delims =: ' устанавливает ": " в качестве символа разделителя, используемого для разбиения строки.
Теперь, когда мы перебираем файл, %% a вернет номер текущей строки, а %% b вернет содержимое этой строки.
Осталось только сравнить параметр % 1 с %% a (вместо переменной счетчика) и использовать %% b для сохранения содержимое текущей строки: , если "%% a" == "% 1" установить строку = %% b .
Дополнительным бонусом является то, что enabledelayedexpansion 'больше не требуется, поскольку приведенный выше код исключает чтение переменной счетчика в середине цикла for.
Редактировать: изменено ' эхо% line% ' на ' эхо.% Line% '. Теперь это будет правильно отображать пустые строки вместо «ECHO выключен». Изменено тип c: \ file_list.txt ^ | findstr / n. * 'до' findstr / n. * "c: \ file_list.txt" ', поскольку команда findstr уже может считывать файлы напрямую.
Джеб, я думаю, что решил все проблемы с особыми персонажами. Дайте этому шанс:
for /f "tokens=*" %%a in ('findstr /n .* "c:\file_list.txt"') do (
set "FullLine=%%a"
for /f "tokens=1* delims=:" %%b in ("%%a") do (
setlocal enabledelayedexpansion
set "LineData=!FullLine:*:=!"
if "%%b" equ "%1" echo(!LineData!
endlocal
)
)