включая специальный символ (&) из результата "for delims" в командный файл - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть скрипт, который читает файл и устанавливает переменную так, как он ее находит.

@echo off
Setlocal EnableDelayedExpansion

for /f "tokens=*" %%V in ('findstr /I /C:title= "%~1"') do set title=%%V
echo %title%

В файле txt есть "title = variable & speed".И скрипт только возвращает:

title=variable
'SPEED' is not recognized as an internal or external command,
operable program or batch file. 

Так как он должен вернуть всю строку.Это часть, я еще не нашел решение.Он должен изменить «&» на «-», так как, наконец, этот скрипт переименовывает файлы.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Я нашел правильную «формулу» для сценария

@echo off
setlocal EnableExtensions EnableDelayedExpansion


for /F "tokens=*" %%V in ('%SystemRoot%\System32\findstr.exe /I /C:"title=" "%~1" 

2^>nul') do set "title=%%V"

set title=!title:^&=-!
    echo "!title!"
endlocal

Как теперь, когда я хотел, он возвращает:

"title=variable - SPEED"

Это не так, как вы предлагали, но этоделает работу.

0 голосов
/ 27 сентября 2018

Во-первых, не включайте отложенное расширение , поскольку здесь оно не нужно.Это может привести к тому, что 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%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...