Поскольку вы не полностью определили, что вы подразумеваете под «определенным местоположением», я сделаю некоторые (разумные, на мой взгляд) предположения, хотя метод, который я представляю, в равной степени действителен независимо от того, быть.
Вы можете получить произвольные строки и произвольные слова в этой строке, используя переменную счетчика строк в сочетании с 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
, чтобы больше переменных могло выйти из области.
Есть ли конкретная причина использовать '&&' («Запустить команду A, если она успешно выполнит команду commandB») вместо '&' («Запустить команду A, а затем запустить commandB»)? [ссылка] (http://ss64.com/nt/syntax-redirection.html) – Stephan
@Stephan, на самом деле, это будет только проблема, если «endlocal» может выйти из строя, и я не верю, что это так. Тем не менее, я бы предпочел использовать '&&', чтобы не путать любые фреймы UNIX, глядя на него, так как '&' отлично работает * на UNIX-земле, и я знаю об их ограниченной умственной способности (просто шутить, но я буду утка для покрытия на всякий случай :-)]. – paxdiablo
Я заметил широко распространенное ложное представление, что '&&' означает« И затем делать »в пакетном режиме (вместо правильного« И если это было успешно, тогда сделайте »). Несмотря на то, что здесь не может быть никакого различия, он может иметь огромное значение в другом контексте. И с быстрым взглядом на твою репутацию мне лучше спросить, если я что-то пропустил. Я не могу сказать ничего о умственных способностях unix-парней - мы убили их всех несколько лет назад [также уклоняясь] – Stephan