#batch-file #cmd
#пакетный файл #cmd
Вопрос:
У меня есть список URL-адресов в текстовом файле, который я хочу прочитать в пакетном файле, и для каждого URL выводится окончательное перенаправление. У меня есть скрипт, который будет корректно обрабатывать один URL-адрес, и скрипт, который будет перебирать список для печати исходного URL-адреса, но нужна помощь в их объединении для вывода перенаправленного URL-адреса для каждого URL-адреса в текстовом файле.
Процесс с одним URL-адресом:
curl -Ls -o /dev/null -w %{url_effective} https://www.example.com
Вывод в текстовый файл:
@echo off
for /f "tokens=* delims=," %%a in (urls.txt) do (
set URL=%%a
)
echo %URL% >> results.txt
pause
Я также хотел бы сделать 5-секундную паузу между каждым URL-адресом в цикле, чтобы не перегружать сервер. Кто-нибудь может помочь мне собрать кусочки вместе?
В идеале, результат должен быть таким:
https://www.example1.com,https://www.example-redirect.com/page1
https://www.example2.com,https://www.example-redirect.com/page2
https://www.example3.com,https://www.example-redirect.com/page3
https://www.example4.com,https://www.example-redirect.com/page4
Ответ №1:
Я предлагаю этот прокомментированный код пакетного файла для этой задачи.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Check the existence of the file in directory of the batch file
rem which should contain the list of urls to process.
if not exist "%~dp0url.txt" (
echo/
echo ERROR: File url.txt is missing in directory: "%~dp0"
echo/
goto EndBatch
)
rem Delete the errors file on existing from a previous batch file execution.
del "%~dp0Errors.txt" 2>nul
rem Process the list of urls with writing into the results file those urls
rem which are redirected to a different url and into the errors file those
rem urls which could not be processed successfully by curl at all. An
rem existing results file is always overwritten on execution of FOR loop.
(for /F "usebackq delims=" %%I in ("%~dp0url.txt") do (
set "UrlValid="
for /F "delims=" %%J in ('curl.exe -Ls -o /dev/null -w %%{url_effective} "%%I" 2^>nul') do (
set "UrlValid=1"
if not "%%I" == "%%J" echo %%I,%%J
)
if not defined UrlValid >>"%~dp0Errors.txt" echo %%I
%SystemRoot%System32timeout.exe /T 5 /NOBREAK >nul
)) >"%~dp0Results.txt"
rem Delete the results file if being an empty file. The errors file
rem is created only if there is at least one error with a url.
if exist "%~dp0Results.txt" for %%I in ("%~dp0Results.txt") do if %%~zI == 0 del "%~dp0Results.txt"
:EndBatch
endlocal
Я не знаю, какие curl.exe
результаты при использовании опубликованной командной строки, потому что у меня нет этой программы, установленной на моем компьютере, и я не читал ее документацию. Я полагаю, что он выводит только окончательный URL. Кроме того, я не знаю, какая ошибка выводится curl.exe
по недопустимому URL-адресу или URL-адресу, по которому возникает ошибка.
Пожалуйста, прочтите комментарии к пакетному файлу, которые представляют собой строки, начинающиеся с command rem
.
Для понимания используемых команд и того, как они работают, откройте окно командной строки, выполните в нем следующие команды и внимательно прочитайте полностью все страницы справки, отображаемые для каждой команды.
call /?
… объясняет%~dp0
… диск и путь аргумента 0, который является полным путем к пакетному файлу, всегда заканчивающимся обратной косой чертой.del /?
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?
timeout /?
Прочитайте документацию Microsoft о использовании операторов перенаправления команд для объяснения >
и >>
и 2>nul
. Оператор перенаправления >
должен быть экранирован символом каретки ^
во внутренней командной строке FOR, чтобы интерпретироваться как буквальный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением внутренней команды FOR, которая выполняет встроенную curl.exe
командную строку с использованием отдельного командного процесса, запускаемого в фоновом режиме с помощью %ComSpec% /c
и командной строки внутри '
, добавленной в качестве дополнительных аргументов.
PS: Я рекомендую взглянуть на бесплатный поисковик ссылок Xenu.