BAT脚本无法从temp.txt提取最新href链接,请求协助排查
问题:批处理脚本无法从temp.txt提取href链接,且无法获取最新日期的链接
我需要从以下temp.txt文件中提取最新日期对应的href链接(即122/):
<html> <head><meta name="robots" content="noindex" /> <title>test</title> </head> <body> <h1>test</h1> </pre><hr/> <pre><a href="../">../</a> <a href="100/">100/</a> 23-Mar-2022 17:12 - <a href="111/">111/</a> 21-Mar-2023 12:08 - <a href="112/">112/</a> 18-Apr-2023 07:46 - <a href="113/">113/</a> 25-May-2023 21:15 - ---- <a href="120/">120/</a> 11-Dec-2023 10:43 - <a href="121/">121/</a> 30-Jan-2024 07:31 - **<a href="122/">122/</a> 11-Mar-2024 06:00 -** <a href="93/">93/</a> 24-Aug-2021 16:07 - <a href="94/">94/</a> 12-Oct-2021 11:21 - <a href="95/">95/</a> 26-Oct-2021 16:25 - <a href="97/">97/</a> 06-Jan-2022 15:23 - <a href="98/">98/</a> 07-Feb-2022 16:04 - <a href="99/">99/</a> 10-Mar-2022 12:18 - <a href="json/">json/</a> 03-Apr-2024 04:26 - <a href="linux/">linux/</a> 17-Jun-2020 12:06 - <a href="known-good-version-with-downloads.json">known-good-version-with-downloads.json</a> 01-Apr-2024 07:03 1.39 KB </pre> <hr/><address style="font-size:small;">Artifactory/7.49.12 Server at artifactrepository.xxxxxx.net Port 80</address></body></html>
我使用了以下批处理脚本:
@echo off setlocal enabledelayedexpansion set "latestHref=" for /f "tokens=*" %%a in ('type temp.txt ^| findstr /i "href="') do ( set "href=%%a" set "href=!href:*href=!" for /f "tokens=2 delims=="" %%b in ("!href!") do ( set "latestHref=%%~b" ) ) if defined latestHref ( echo Latest href link: !latestHref! ) else ( echo No href links found in the text file. )
但运行后始终返回No href links found in the text file,预期结果应为122/,请帮忙解决。
问题分析与解决
1. 原脚本失败原因
- 原脚本第二个
for /f循环使用delims==分割字符串,但目标内容中href后是="(HTML转义引号),分割后tokens=2无法正确提取链接内容;同时字符串中的&等特殊字符会干扰批处理解析,导致循环无法赋值。 - 原逻辑仅取最后一行的href,未按日期排序筛选最新链接,即使修复提取逻辑,也会得到最后一行的
known-good-version-with-downloads.json而非目标的122/。
2. 修复后的脚本
@echo off setlocal enabledelayedexpansion :: 初始化变量 set "latestDate=" set "latestHref=" :: 遍历所有包含href的行,排除上级目录链接 for /f "tokens=1,2,3*" %%a in ('type temp.txt ^| findstr /i "href=" ^| findstr /v "../"') do ( :: 提取href引号内的内容 set "line=%%a" set "href=!line:*href="=!" set "href=!href:"=!" :: 提取日期并转换为可排序的YYYYMMDD格式 set "day=%%b" set "month=!day:~3,3!" set "year=!day:~7,4!" :: 月份转数字 if "!month!" equ "Jan" set "month=01" if "!month!" equ "Feb" set "month=02" if "!month!" equ "Mar" set "month=03" if "!month!" equ "Apr" set "month=04" if "!month!" equ "May" set "month=05" if "!month!" equ "Jun" set "month=06" if "!month!" equ "Jul" set "month=07" if "!month!" equ "Aug" set "month=08" if "!month!" equ "Sep" set "month=09" if "!month!" equ "Oct" set "month=10" if "!month!" equ "Nov" set "month=11" if "!month!" equ "Dec" set "month=12" set "dayNum=!day:~0,2!" set "sortDate=!year!!month!!dayNum!" :: 比较日期,保留最新的链接 if not defined latestDate ( set "latestDate=!sortDate!" set "latestHref=!href!" ) else ( if !sortDate! gtr !latestDate! ( set "latestDate=!sortDate!" set "latestHref=!href!" ) ) ) :: 输出结果 if defined latestHref ( echo Latest href link: !latestHref! ) else ( echo No valid href links found. ) endlocal
3. 脚本说明
- 用
findstr /v "../"排除上级目录的无效链接; - 通过字符串截取直接提取href引号内的内容,规避HTML转义字符干扰;
- 将日期转换为
YYYYMMDD格式,通过数值比较确保获取最新日期对应的链接; - 遍历过程中持续更新最新日期和对应href,最终输出目标结果。
内容的提问来源于stack exchange,提问作者Arul Suju
相关产品推荐
相关产品推荐

