Таким образом, пользователь не вводит IP-адрес в качестве заранее заданного текста приглашения, но URL-адрес, который может содержать %
, &
, ?
, |
и другие символы со специальным значением для Windows процессор команд cmd.exe
, обрабатывающий пакетный файл.
Я предлагаю использовать следующий пакетный файл:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
:UserPrompt
set "InputURL="
set /P "InputURL=Enter the URL: "
if not defined InputURL goto UserPrompt
set "InputURL=%InputURL:"=%"
if not defined InputURL goto UserPrompt
setlocal EnableDelayedExpansion
if not "!InputURL:~-1!" == "/" set "InputURL=!InputURL!/"
set "InputURL=!InputURL!master_1.m3u8|user-agent=KAIOS/2.0"
echo Link 1 : !InputURL!
endlocal
endlocal
echo/
pause
Переменная среды InputURL
явно не определена перед запросом пользователя .
Пользователь может просто нажать клавишу RETURN или ENTER , ничего не вводя вообще. В этом случае переменная окружения InputURL
все еще не определена как явно неопределенная до запроса пользователя. Оно сохранит свое текущее значение, если оно будет определено до запроса пользователя.
Первое условие IF просто проверяет, набрал ли пользователь строку вообще, и снова запрашивает пользователя, если ничего не было. ввод пользователя.
Далее все "
удаляются из строки, введенной пользователем. Это действие может привести к выполнению set "InputURL="
, если пользователь введет только один или несколько "
и ничего больше, и, следовательно, переменная среды InputURL
снова не будет определена. По этой причине пользователю снова предлагается ввести только один или несколько "
преднамеренно или по ошибке.
Двойная кавычка, оставленная имени переменной InputURL
, и двойная кавычка в конце очень важны здесь , Он гарантирует, что первая (и единственная) строка аргумента команды set
заключена в двойные кавычки. По этой причине командный процессор Windows интерпретирует такие символы, как &
и |
внутри строки аргумента в двойных кавычках, как буквенные символы, а не как операторы.
Тогда задержка расширения переменной среды включен, который выдвигает текущие состояния расширений команд (включено) и отложенного расширения (отключено), а также текущего каталога и всех переменных среды в стеке перед включением отложенного расширения. Все дальнейшие команды выполняются с новым набором переменных среды, пока endlocal
не будет выполнен с помощью cmd.exe
.
Использование отложенного расширения позволяет безопасно обрабатывать строку ввода пользователя далее как строку ввода пользователя больше не изменяет командные строки пакетного файла перед выполнением, как это делается при использовании %InputURL%
без изменения содержимого файла пакетного файла.
В этой новой новой среде проверяется следующее, если пользователь входная строка не заканчивается /
, в этом случае sla sh добавляется к пользовательской входной строке.
Далее добавляется фиксированная строка, содержащая оператор перенаправления |
, который интерпретируется здесь как литерал символ из-за нахождения внутри строки аргумента с двойными кавычками. Таким образом, нет необходимости экранировать оператор с ^
, как это было бы необходимо в случае, если строка аргумента команды set
не заключена в двойные кавычки, как это сделано здесь с "
слева от имени переменной. "
между знаком равенства и значением строки, присвоенным переменной, здесь не будет работать. По этой причине см., Например,
Как установить переменные среды с пробелами?
Команда echo
используется для вывода измененного URL-адреса с дополнительным текстом с использованием отложенного расширения, чтобы иметь возможность для вывода строки без использования "
, поскольку echo
будет также выводить двойные кавычки.
См. также: Как синтаксический анализ сценариев Windows Command Interpreter (CMD.EXE) ?
Предыдущая среда восстанавливается с помощью endlocal
, что не только приводит к отключению отложенного расширения, как это было до setlocal EnableDelayedExpansion
, но и к восстановлению также состояния расширений команд (не измененных), текущий каталог (без изменений) и предыдущий список переменных среды с их значениями. Это означает, что переменная окружения InputURL
снова имеет строковое значение без одной или двух модификаций, сделанных между setlocal EnableDelayedExpansion
и endlocal
.
Последний endlocal
просто явно восстанавливает среду перед запуском этого пакетного файла.
В последний раз пользователю предлагается нажать любую клавишу, чтобы просмотреть выходные данные и выйти из обработки пакетного файла из-за достижения конца пакета файл.
См. также: