Во-первых, не включайте отложенное расширение , поскольку здесь оно не нужно.Это может привести к тому, что findstr
не найдет файл для открытия, если пакетный файл вызывается с именем файла без или с путем, содержащим один или несколько восклицательных знаков.
Во-вторых, FOR опция "tokens=*"
приводит к удалению начальных пробелов / табуляций из строки вывода: FINDSTR не начинается с точки с запятой, и если что-то осталось, присвойте оставшуюся часть строки указанной переменной цикла.Это нормально, если такое поведение требуется здесь.В противном случае было бы лучше использовать "delims="
, который определяет пустой список разделителей, что приводит к присвоению всей строке, не начинающейся с точки с запятой, указанной переменной цикла.Строка аргумента, не заключенная в двойные кавычки delims^=^ eol^=
определяет пустой список разделителей и отсутствие символа конца строки для назначения, а также строка, начинающаяся с точки с запятой в переменной цикла.Два знака равенства и символ пробела должны быть экранированы символом вставки ^
, чтобы интерпретировать их как буквенные символы, а не как разделители аргументов.
В-третьих, амперсанд вне строки аргумента в двойных кавычках интерпретируется как оператор длябезоговорочно выполнить команду после &
после выполнения команды до &
.Подробнее см. Одна строка с несколькими командами с использованием пакетного файла Windows .По этой причине рекомендуется заключать строку аргумента команды SET в двойные кавычки, как подробно описано в ответе на Почему после использования set var не выводится строка с 'echo% var%' после использования 'set var= текст 'в командной строке?
Поэтому я предлагаю использовать следующий код:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LoadedTitle="
for /F "tokens=*" %%V in ('%SystemRoot%\System32\findstr.exe /I /C:"title=" "%~1" 2^>nul') do set "LoadedTitle=%%V"
if defined LoadedTitle (
setlocal EnableDelayedExpansion
echo !LoadedTitle!
endlocal
)
endlocal
Читать этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL .
Обратите внимание, что вместо /C:title=
используется в командной строке *1039* FINDSTR , в противном случае FINDSTR будет в этом особом случае искать только для title
.Причина в том, что командная строка в круглых скобках выполняется в отдельном командном процессе, запущенном FOR с cmd.exe /C
в фоновом режиме и знаком равенства, не заключенным в строку в двойных кавычках и не экранированным с ^
будет удалено текущим командным процессом из-за интерпретации как разделитель.В окне командной строки можно использовать командную строку FINDSTR с /C:title=
без двойных кавычек, но не здесь, в этой командной строке FOR в командном файле.
Прочтите также статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul
.Оператор перенаправления >
должен быть экранирован с помощью символа вставки ^
в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку findstr
в отдельном командном процессе, запущенном в фоновом режиме.
Требуется временное включение отложенного расширения только для вывода строки с загруженной строкой заголовка, поскольку будет изменено использование только echo %LoadedTitle%
перед выполнением до echo title=variable & speed
и амперсанд снова не интерпретируется как буквенный символ для вывода ECHO , но как оператор для запуска speed
после выполнения echo title=variable
.
Рекомендуючитать
Программа записи пакетных файлов всегда должна учитывать, что в итоге выполняется командным процессором Windows послеr синтаксический анализ командной строки один или несколько раз, поскольку это может отличаться от написанного в командном файле при использовании ссылок на переменные среды с синтаксисом %variable%
.