我想使用 curl 下载最新版本的这个文件。但是,该网站有一个 robots.txt,我认为这就是阻止我使用curl -L -z WorldGuard.zip http://www.curse.com/server-mods/minecraft/worldguard/download
它来获取它的原因。http://addons.curse.cursecdn.com/files/684/741/worldguard-5.7.3.zip
页面的 html 源代码中有一个指向该文件的直接链接,我能使用此链接来卷曲它,因为这个链接不是永久链接,所以我需要找到一种方法从第一个链接(它是永久链接)获取此 url。
如果我使用,curl -L http://www.curse.com/server-mods/minecraft/worldguard/download
我最终会得到这作为输出。我尝试使用FOR /F "skip=628 tokens=10,11,12,13,14 delims=/ " %%a in ('curl -L http://www.curse.com/server-mods/minecraft/worldguard/download') DO curl -z foo.zip %%a')
,但似乎可以跳过的行数有限制(类似于 31 的标记限制),并且它可能还会给我之后的所有行(这不是我想要的)。
接下来,我尝试将输出保存到文本文件并删除除我想要的行之外的所有行,但是,我不知道如何删除不包含特定字符串的行。我原本想只关注包含特定字符串的行"http://addons.curse.cursecdn.com/files/"
(换句话说,包含我想要的 url 的行),但我不知道该怎么做。
我怎样才能仅获取 url(或更改的部分:)684/741/worldguard-5.7.3.zip
,然后让 curl 下载它?
编辑:如果没有简单的方法在批处理脚本和/或使用 curl 执行此操作,我愿意接受其他替代方案。我愿意接受使用 Visual Basic (.vbs.)、PowerShell 或任何可以从批处理文件执行的答案(几乎所有内容都应该如此)。我仍然更喜欢使用批处理和 curl 来保持一致并在一个文件中,因为我已经在批处理中拥有了 90% 的我想要的内容。另外,我对非批处理的东西不太熟悉,所以如果您能解释一下脚本的作用,我会更满意。
答案1
以下命令将在 .htm 文件中查找包含下载链接的行,并使用一种快速而粗略的方法从该行中提取 URL。这种方法不是很可靠,但只要“如果您的下载未开始,请单击此处”行使用的 html 没有发生重大变化,它应该可以工作。
for /F "tokens=4 delims==" %i in ('findstr download-link source.htm') do
@set match=%i
set zipurl=%match:~1,-7%
echo %zipurl%|findstr /R ^http://.*\.zip$
属性 'class="download-link"' 公开了链接到 .zip 文件的标签。使用等号作为分隔符,第四个标记将是"http://addons.[...].zip" class
。为了摆脱周围的引号和单词 'class', 的子字符串%match%
存储在 中%zipurl%
。第三行是可选的,但可用于检查脚本是否仍然有效。%errorlevel%
如果提取的 URL 以 'http://' 开头并以 '.zip' 结尾,则 Findstr 设置为零,否则将其设置为一。
若要在批处理文件中使用,请替换%i
为%%i
。
答案2
...但是,我不知道如何删除不包含特定字符串的行...
删除以下行不要包含特定字符串,请参阅此帖子 正则表达式匹配不包含单词的字符串
帖子中有更多信息,并提供了各种其他答案,但这个答案的基础是:
你可以使用sed
和grep
(或者sed
和find
)来过滤文件的行。
- 搜索/替换整个文件,在包含以下内容的每一行开头添加唯一的“标签”任何文本。
- 对于包含目标字符串,从行首删除唯一的“标签”。
- 此时,所有以唯一“Tag”开头的行,不要包含目标字符串。现在您可以
delete
(或者只对这些行执行“其他操作”)。
答案3
你可以使用以下方法以更少的步骤完成此操作sed
和grep
,但这里有一个仅使用内置命令的解决方案。
@echo off
rem edit next line to include your filename
set "zzfilename=captured-page.html"
rem get the target line
type "%zzfilename%"|find /i "data-href"|find /i ".zip">"zztarget.txt"
for /f "usebackq delims=" %%f in (`type "zztarget.txt"`) do set zzaaa=%%f
rem change double-quotes to single-quotes
set "zzaaa1=%zzaaa:"='%"
rem remove unneeded text from the beginning of the line
set "zzaaa2=%zzaaa1:*data-href=gotit%"
rem remove the "<" and ">" characters
set "zzaaa3=%zzaaa2:<='%"
set "zzaaa4=%zzaaa3:>='%"
rem from what remains, take only the desired URL
for /f "usebackq tokens=2 delims='" %%f in (`echo %zzaaa4%`) do set "zzgotit=%%f"
rem show the work and cleanup
set zz
set "zzaaa="
set "zzaaa1="
set "zzaaa2="
set "zzaaa3="
set "zzaaa4="
del "zztarget.txt">nul 2>&1
完整的 URL 将包含在变量中zzgotit
。