В пакетном файле используйте этот код:
@echo off
for /F "usebackq tokens=1* delims==" %%A in ("C:\Program Files\SplunkUniversalForwarder\etc\splunk.version") do if /I "%%~A" == "VERSION" if not "%%~B" == "" set "Version=%%~B" & goto HaveVersion
echo Error: Could not find VERSION= with a version string in file:
echo C:\Program Files\SplunkUniversalForwarder\etc\splunk.version
pause
goto :EOF
:HaveVersion
echo Version is: %Version%
pause
Обратите внимание на пробел в Program Files
.
Команда FOR с используемой опцией /F
читает указанный файл построчно с пропуском пустых строк и строк, начинающихся с ;
, который является значением по умолчанию для опции eol
(конец строки).
Опция usebackq
необходима для полученияполное имя файла, заключенное в двойные кавычки, интерпретируется как имя файла, а не как строка для обработки.Двойные кавычки "
вокруг полного имени файла требуются из-за пробела.
delims==
переопределяет разделители для разделения строк на подстроки (токены) из пробела по умолчанию и горизонтальной табуляции до знака равенства.Поэтому FOR теперь разделяет строки, используя только =
в качестве символа-разделителя для строк.
tokens=1*
означает, что первая подстрока, разделенная знаком равенства, должна быть присвоена переменной цикла A
,А оставшаяся часть строки после первого знака (ей) равенства должна быть присвоена без дальнейшего разделения на следующую переменную цикла в соответствии с ASCII таблицей , которая в этом случае является переменной цикла B
.Теперь также должно быть понятно, почему переменные цикла чувствительны к регистру, а переменные среды не чувствительны к регистру.Имеет значение то, что является следующей переменной цикла, если указанная переменная цикла имеет значение A
или a
.
При каждом запуске цикла сначала выполняется сравнение строк без учета регистра, чтобы проверить, является ли строка версиинаходится в начале текущей строки.Если это первое условие истинно, второе IF условие используется для проверки того, что в файле действительно есть строка версии с правом на знак равенства.Если это второе условие также верно, строка версии присваивается переменной среды Version
, и цикл завершается, продолжая обработку пакетного файла с переходом на строку под меткой HaveVersion
.Поэтому другие строки в файле не обрабатываются FOR .
. В общем случае лучше ссылаться на переменную окружения ProgramFiles
с %ProgramFiles%
вместо использования C:\Program Files
в качествеКаталог стандартных программных файлов для 64-битных приложений в Windows x64 соответственно для 32-битных приложений в Windows x86 может находиться на любом диске с любым именем папки.Но Сведения о реализации Windows WOW64 должны быть приняты во внимание, если командный файл должен работать на 32-битной Windows, на 64-битной Windows в 64-битной среде и на 64-битной Windows в 32-битной среде,См. Также статью в Википедии о Переменные среды Windows .
Для понимания используемых команд и их работы откройте окно командной строки, выполните там следующие команды и полностью прочитайте все отображаемые страницы справки.для каждой команды очень тщательно.
echo /?
for /?
goto /?
if /?
pause /?
set /?
См. Также Одна строка с несколькими командами с использованием пакетного файла Windows для объяснения оператора &
.