Я хочу использовать 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% того, что я хочу в пакетной. Кроме того, я не настолько знаком с вещами, которые не являются пакетными, поэтому я бы предпочел, чтобы вы объяснили, что делает сценарий.

3 ответа3

0

Вы можете сделать это за несколько шагов, используя 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.

0

... однако я не знаю, как удалить строки, которые не содержат конкретной строки ...

Чтобы удалить строки, которые НЕ содержат определенную строку, см. Этот пост Регулярное выражение для соответствия строке, не содержащей слова

В этом посте содержится больше информации, даются и другие ответы, но основы этого ответа:

Вы можете использовать комбинацию sed и grep (или sed и find) для фильтрации строк файла.

  1. Поиск / замена всего файла, чтобы добавить уникальный "тег" в начало каждой строки, которая содержит любой текст.
  2. Для всех строк, которые содержат целевую строку, удалите уникальный "тег" в начале строки.
  3. На этом этапе все строки, начинающиеся с уникального "тега", НЕ содержат целевой строки. Теперь вы можете delete (или сделать «что-то еще») только эти строки.
0

Следующие команды будут искать строку, содержащую ссылку для загрузки в файле .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 . Чтобы избавиться от окружающих кавычек и слова «класс», подстрока %match% сохраняется в %zipurl% . Третья строка является необязательной, но может использоваться для проверки того, работает ли сценарий. Findstr устанавливает %errorlevel% в ноль, если извлеченный URL-адрес начинается с «http://» и заканчивается на «.zip», и устанавливает его равным единице в противном случае.

Для использования в пакетном файле замените %i на %%i .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .