Создание текстового файла с запросом URL из пользовательского файла bat, CMD продолжает закрываться? - PullRequest
2 голосов
/ 21 января 2020

Я пытаюсь создать 4 URL-адреса, принимая данные от пользователя и меняя последние несколько префиксов:

@echo off
type bot.txt
set /p id="Enter the ip adress:"

И ссылка будет выглядеть так:

https://live.star.com/hls/live/2004211/2020/hin/15mindvr1440006161q6nli0p96c19january2020

и полный URL должен выглядит так:

https://live.star.com/hls/live/2004211/2020/hin/15mindvr1440006161q6nli0p96c19january2020/master_1.m3u8|user-agent=KAIOS/2.0

, где master_1 будет master_2, master_3 и master_4

Я хочу, чтобы это произошло, и сохраните в текстовом файле! Но команда echo также не дает мне результата!

set /p id="Enter the ip adress:"
echo Link 1 : %id%^
master_1.m3u8|user-agent=KAIOS/2.0

Это приводит к сбою CMD

Есть ли способ автоматизировать это?

Спасибо!

1 Ответ

1 голос
/ 21 января 2020

Таким образом, пользователь не вводит 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 просто явно восстанавливает среду перед запуском этого пакетного файла.

В последний раз пользователю предлагается нажать любую клавишу, чтобы просмотреть выходные данные и выйти из обработки пакетного файла из-за достижения конца пакета файл.

См. также:

...