Вот более простое решение:
for /f "delims=: tokens=1,2" %A IN ('findstr /n "%uname%" Users.txt') do ( @set "number_of_line=%A" && @set "_uname=%B" )
Или, используя find
вместо findstr
(довольно сложно):
for /f "eol=- delims=[] tokens=1-2" %A IN ('find /n "%uname%" Users.txt') do ( @set "number_of_line=%A" && @set "_uname=%B" )
Как и в вашем сообщении, которое вы запросиликод пакетного файла (у вас двойные знаки процента (%%
)) вы можете удвоить знаки процента переменных .
Позвольте мне объяснить мой код:
В обоих двух циклах мы анализируем вывод команд.Вы должны знать формат команды-вывода и почему использование findstr
намного проще.
findstr
- Мы используем
/n
параметр с findstr
, который сообщает этоecho
строка, в которой была найдена указанная строка. - После опции
/n
мы указываем строку, в которой следует искать указанную строку после файла. - После этого мы указываем нужный файлдля поиска в указанной строке.
Вывод будет:
%line_number%:%content_of_line%
Итак, мы разберем его, сказав:
- DON'T PARSE
:
символ в токене с опцией delims=:
! 1042 * - Доступ к
line_number
с %(%)A
и content_of_line
с %(%)B
с использованием опции tokens=1,2
. - Хорошо известно: указатьпеременная буква add
IN
, затем команда для анализа и установки переменной номер строки и ее содержимого.
find
- Мы используем
/n
параметрс find
, который сообщает echo
строку, в которой найдена указанная строка. - После опции
/n
мы указываем строку, в которой нужно искатьуказывается после файла. - После этого мы указываем файл, в котором мы ищем указанную строку.
Синтаксис очень похож, но вывод совершенно другой !:
---------- %FILENAME_SPECIFIED_WITH_CAPITAL_LETTERS%
[%line_number%]%line_content%
Итак, здесь:
- Мы игнорируем строки, начинающиеся с
-
с опцией eol=-
. - Мы не делаемразберите
[]
символов на токены с помощью delims=[]
. - Мы хотим получить доступ к
line_number
с %(%)A
и line_content
с %(%)B
, поэтому мы добавляем опцию tokens=1,2
. - Затем, продолжая, как описано выше (хорошо известно).
Чтобы лучше понять, как работают эти команды, я предлагаю вам открыть новое окно cmd и набрать:
for /?
find /?
findstr /?
Попробуйте свои примеры с find
и finstr
, чтобы полностью понять, как они работают.
Некоторые интересные ссылки для дальнейшего чтения: