2016-07-15 3 views
0

Есть ли способ получить/цикл f (или что-нибудь еще) для чтения определенной строки?Пакетный файл. Прочитайте определенную строку и сохраните определенную строку в этой строке как переменную

Вот код, который я имею до сих пор, он читает первое слово каждой строки.

@echo off 
set file=readtest.txt 
for /f "tokens=1 delims= " %%A in (%file%) do (echo %%A) 
pause 

Если кто-то может указать мне в правильном направлении, это было бы очень признательно.

Благодаря

Дополнительная информация: Я хочу сделать пакетный файл, который будет переименовать файл TXT в строку в этом TXT файл, расположенный в определенном месте. Я понял, как переименовывать файлы, все, что мне нужно, чтобы научиться делать, - это получить строку (расположенную в определенном месте) в файле, который войдет в имя этого TXT-файла.

ответ

0

Поскольку вы не полностью определили, что вы подразумеваете под «определенным местоположением», я сделаю некоторые (разумные, на мой взгляд) предположения, хотя метод, который я представляю, в равной степени действителен независимо от того, быть.

Вы можете получить произвольные строки и произвольные слова в этой строке, используя переменную счетчика строк в сочетании с tokens.

Предположим, что ваше текстовое имя файла может быть найдено как второй аргумент в четвертой строке файла infile.txt. Вы можете получить что-то вроде:

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set /a "line = 0" 
for /f "tokens=2 delims= " %%a in (infile.txt) do (
    set /a "line = line + 1" 
    if !line!==4 set thing=%%a 
) 
endlocal & set thing=%thing% 
echo %thing% 

Это на самом деле использует несколько «трюков», которые гарантируют дальнейшее объяснение:

  • line счетчик, чтобы убедиться, что вы только захватить то, что вы хотите от конкретного хотя вы можете изменить тест !line!==4 на все, что вам нужно, например, на строку, начинающуюся с #, пятую строку, содержащую строку xyzzy и так далее.
  • использование setlocal/endlocal, чтобы эффективно предоставить вам область, из которой переменные не могут протечь. Это хорошая практика программирования даже для языка часто не обычно ассоциируется с такими вещами :-)
  • использование endlocal & set для обхода, что сфера, так что thing это единственное, что делает на самом деле утечки (как это должно быть) ,
  • использование замедленного расширения и !..! переменных для обеспечения их правильности в пределах цикла for. Без этого %..% всегда будет расширяться до значения, которое они были установлены, когда цикл for запущен.

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

Для петли for команда - это целая вещь от for до финала ).Это означает, что если вы используете %line% в цикле, который будет оценен до, цикл начнет работать, что приведет к тому, что он всегда будет 0 (сама переменная может измениться, но ее расширение уже произошло). Тем не менее, !line! будет оцениваться каждый раз, когда он встречается внутри цикла, поэтому будет иметь правильное значение.

Точно так же, в то время как endlocal обычно ясно все переменные, созданные после setlocal, команда:

endlocal & set thing=%thing% 

является одного команды в контексте расширения. %thing% расширяется до тогоendlocal запускается, то есть это фактически становится:

endlocal & set thing=whatever_thing_was_set_to_before_endlocal 

Вот почему использование setlocal и endlocal & set очень полезный способ ограничить переменные «убегающих» из сферы. И, да, вы можете связать несколько строчек & set, чтобы больше переменных могло выйти из области.

+0

Есть ли конкретная причина использовать '&&' («Запустить команду A, если она успешно выполнит команду commandB») вместо '&' («Запустить команду A, а затем запустить commandB»)? [ссылка] (http://ss64.com/nt/syntax-redirection.html) – Stephan

+0

@Stephan, на самом деле, это будет только проблема, если «endlocal» может выйти из строя, и я не верю, что это так. Тем не менее, я бы предпочел использовать '&&', чтобы не путать любые фреймы UNIX, глядя на него, так как '&' отлично работает * на UNIX-земле, и я знаю об их ограниченной умственной способности (просто шутить, но я буду утка для покрытия на всякий случай :-)]. – paxdiablo

+2

Я заметил широко распространенное ложное представление, что '&&' означает« И затем делать »в пакетном режиме (вместо правильного« И если это было успешно, тогда сделайте »). Несмотря на то, что здесь не может быть никакого различия, он может иметь огромное значение в другом контексте. И с быстрым взглядом на твою репутацию мне лучше спросить, если я что-то пропустил. Я не могу сказать ничего о умственных способностях unix-парней - мы убили их всех несколько лет назад [также уклоняясь] – Stephan

Смежные вопросы