我在文本文件中有一个 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
我还想在循环中的每个 URL 之间放置 5 秒的暂停,这样我就不会超载服务器。有人可以帮我把这些碎片拼凑起来吗?
理想情况下,输出如下:
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
我建议将此注释的批处理文件代码用于该任务。
@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%\System32\timeout.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
会输出什么,因为我的计算机上没有安装此程序,也没有阅读其文档。我想它只输出最终的网址。此外,我不知道 curl.exe
在无效网址或发生错误的网址上输出的错误。
请阅读批处理文件的注释,这些注释是以命令
rem
开头的行。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
...解释 %~dp0
...参数 0 的驱动器和路径,这是始终以反斜杠结尾的完整批处理文件路径。del /?
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?
timeout /?
阅读有关使用命令重定向运算符的 Microsoft 文档,了解
>
、>>
和2>nul
的说明。当 Windows 命令解释器在执行内部命令 FOR(执行嵌入的
>
)之前处理此命令行时,重定向运算符 ^
必须在内部 FOR 命令行上使用脱字符号 curl.exe
进行转义,以便被解释为文字字符。命令行使用单独的命令进程在后台启动,并使用 %ComSpec% /c
和 '
中的命令行作为附加参数附加。
PS:我建议免费看看Xenu's Link Sleuth。