- -
[решено] wget
(
http://forum.oszone.net/showthread.php?t=216913)
wget
Нужна помощь в написании скрипта по запуску программы, скаченной и обновлённой с помощью wget Если обновления программы не произошло, запускать её не нужно.
|
sov44, поскольку ошибки при этом не возникает ( 2.12 Exit Status), на мой взгляд, самый надёжный способ — посчитать контрольную сумму локального файла до вызова wget и после ( File Checksum Integrity Verifier, Sigcheck, FSUM или скриптом на WSH/PoSH), Затем сравнить.
P.S. Можно, конечно, попробовать сравнивать дату/время до и после, поиграться с атрибутами и т.п. Но контрольная сумма — надёжнее.
|
Iska, а если как то попытаться выловить в командной строке wget строчку, что файл уже скачан и от неё пробовать, чтобы не пользоваться сторонним софтом?
|
sov44, конечно, можно. Но тут хорошо бы посмотреть в исходный код wget, дабы убедиться в единственности данного сообщения. А так — например, вот:
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
("%ProgramFiles%\WGet\wget.exe" --timestamping "http://download.sysinternals.com/Files/Sigcheck.zip" 2>&1 |^
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" >nul) && (
echo Skipping
) || (
echo Not skipping
)
endlocal
exit /b 0
P.S. Это только пример! Из данного кода не видно, был ли файл загружен или нет. Видно только — был или не был пропущен.
|
Iska, Спасибо! Именно то, что и нужно. Запуск прикручу.
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
(wget -N http://giskirov.ru/download/download.php?book=3 2>&1 |^
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" >nul) && (
echo Обновления файла нет
) || (
echo Файл скачан и обновлён
)
endlocal
pause
exit /b 0
|
Упаковал в rar sfx батник рядом со скриптом установки программы. Программа скачалась в %temp% и и от туда установилась. Подскажите, как скаченную программу ( из %temp% ) скопировать в директорию, из которой был запущен rar sfx?
|
Цитата:
Цитата sov44
Спасибо! Именно то, что и нужно. »
|
sov44, нет! Вы меня так и не поняли:
Цитата:
Цитата Iska
P.S. Это только пример! Из данного кода не видно, был ли файл загружен или нет. Видно только — был или не был пропущен. »
|
Это никак не то, что нужно. Допустим, Вы пытаетесь загрузить файл, загрузка по каким-то причинам обрывается, а пакетный файл в Вашем примере честно скажет — «Файл скачан и обновлён», что не есть верно. Понимаете?
Надо:
1. Отследить код возврата wget.
2. Если он нулевой — тогда уже имеет смысл проверять выдачу wget на наличие текста о пропуске загрузки, наподобие:
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
set sURL=http://download.sysinternals.com/Files/Sigcheck.zip
call :GetTemporaryName
>"%TemporaryName%" 2>&1 "%ProgramFiles%\WGet\wget.exe" --timestamping "%sURL%" && (
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" "%TemporaryName%" >nul && (
echo Download Skipping
) || (
echo Download OK
)
) || (
echo Download Error
)
del /f /q "%TemporaryName%"
endlocal
exit /b 0
rem ==========================================================================
rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion
:NextName
set sTempName=%temp%\temp%random%.tmp
if exist "%sTempName%" goto :NextName
set sProcName=%~0
endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================
|
Iska, на Вашем примере не могу отследить переменную пути, откуда запущен rar sfx
|
Цитата:
Цитата Iska
Надо:
1. Отследить код возврата wget. »
|
Как их отследить?
|
Код из поста #7 это делает:
Код:
…
>"%TemporaryName%" 2>&1 "%ProgramFiles%\WGet\wget.exe" --timestamping "%sURL%" && (
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" "%TemporaryName%" >nul && (
echo Download Skipping
) || (
echo Download OK
)
) || (
echo Download Error
)
…
|
Iska, добавил проверку на скачивание, однако где-то ошибка, т.к. при наличии скачанного файла не появляется сообщение "echo Обновления файла нет"
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
2>&1 wget.exe -N http://giskirov.ru/download/download.php?book=3 && (
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" >nul && (
echo Обновления файла нет
) || (
start /wait gis.exe
)
) || (
echo Ошибка скачивания
)
endlocal
exit /b 0
|
sov44, у Вас вывод «wget.exe» идёт на консоль, а не во временный файл. «findstr.exe» в Вашем варианте вовсе должен стоять и ждать ввода с консоли, ибо ему не указано, где осуществлять поиск.
Ещё раз посмотрите на код из #7.
|
Iska, вновь нужна Ваша помощь! При запуске скрипта из папки, идёт скачивание файла. При запуске скрипта через планировщик скачивание не идёт. Перепробовал разные варианты, решения не нашел. :(
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
set sURL=http://akelpad.sourceforge.net/files/tools/AkelUpdater.zip
call :GetTemporaryName
>"%TemporaryName%" 2>&1 "c:\перевалка\1\wget.exe" -N "%sURL%" &&(
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" "%TemporaryName%" >nul &&(
echo.
echo Обновления нет^^!
ping 127.0.0.1 -n 3 >nul
) || (
Echo Тут запускается программа ^^!
ping 127.0.0.1 -n 3 >nul
)
) || (
Echo msgbox "╬сэютыхэшх эх тючьюцэю. ═хЄ яюфъы■ўхэш* шэЄхЁэхЄ">"%temp%\msg.vbs"
%temp%\msg.vbs
del %temp%\msg.vbs
)
if not exist "%windir%\Tasks\At1.job" AT 11:00 /INTERACTIVE /EVERY:7 "c:\перевалка\1\run.cmd"
endlocal
exit /b 0
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion
:NextName
set sTempName=%temp%\temp%random%.tmp
if exist "%sTempName%" goto :NextName
set sProcName=%~0
endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
|
Цитата:
Цитата sov44
При запуске скрипта через планировщик скачивание не идёт. »
|
Как Вы это определили?
|
запускал планировщик вручную. Скрипт пишет, что обновления нет, даже если рядом нет скачанного файла.
|
Цитата:
Цитата sov44
запускал планировщик вручную. »
|
Поздравляю! Я лично предпочитаю, чтобы этим занималась ОС.
Как именно Вы определили, что:
|
Цитата:
Цитата Iska
Поздравляю! Я лично предпочитаю, чтобы этим занималась ОС. »
|
Я тоже. А как проверить работу? ждать месяц? :)
|
sov44, вот Вы запустили задание (а не «планировщик») вручную. Как Вы определяете… Ага, вижу: Вы позже дописали в пост #16 — как. Вот этого я от Вас и добивался.
Теперь вставьте в Ваш пакетный файл:
и осознайте, что он рассчитан на корректную работу исключительно в том случае, если текущим каталогом для него является тот самый каталог, в котором находится пакетный файл. В случае созданного Вами задания это не так.
|
Iska, кажется решил, добавив путь для сохранения скачанного файла
Код:
call :GetTemporaryName
>"%TemporaryName%" 2>&1 "c:\перевалка\1\wget.exe" -N -P "c:\перевалка\1" "%sURL%" &&(
findstr.exe /r /c:"^Server file no newer than local file .* -- not
Видимо wget при запуске из планировщика не находил, что с чем сравнивать :)
|
В продолжение темы
Решил испытать wget на работе, где установлен прокси (192.168.0.5:8080). Выход в инет естественно не получился.
Iska, подскажите, как определить наличие прокси, если он есть, добавить нужную переменную и скачать файл. Как вариант кода - код из поста 14
Upd. Нашел, как определить настройки прокси
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
SET UNISTALL=HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
For /F "Skip=4 Tokens=3 delims= " %%A In ('Reg Query "%UNISTALL%" /V ProxyServer 2^>nul') Do Set Proksi=%%A
Echo Настройки прокси %Proksi%
pause>nul
но вот как добавит это в wget, пока не знаю.
|
жаль. Решил так:
Код:
if exist wget.ini del /q wget.ini
SET UNISTALL=HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
For /F "Skip=4 Tokens=3 delims= " %%A In ('Reg Query "%UNISTALL%" /V ProxyServer 2^>nul') Do Set Proksi=%%A
if defined Proksi (
>> wget.ini Echo http_proxy = %Proksi%/
>> wget.ini Echo use_proxy = on
)
|
Подскажите, есть ли в Wget ключ, чтобы не скачивались файлы менее 15333 б. Или только парсить лог?
|
вроде понятно написано.
решено через парсер лога.
|
sov44, в том-то и дело, что непонятно. Ответ напрямую будет зависеть от того, как Вы загружаете файлы. Варианта прямого указания:
Цитата:
Цитата sov44
ключ, чтобы не скачивались файлы менее 15333 б. »
|
не существует. Если сервер поддерживает отдачу размера, то можно запросить его, наподобие (кодировка пакетного файла — windows-1251):
читать дальше »
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
set sURL=http://files.avast.com/iavs5x/avast_free_antivirus_setup.exe
>nul chcp 1251
for /f "usebackq tokens=2 delims= " %%i in (
`@ "%ProgramFiles%\GnuWin32\bin\wget.exe" --verbose --spider "%sURL%" 2^>^&1 ^| find.exe /i "Длина: "`
) do set sLength=%%~i
>nul chcp 866
if defined sLength echo [%sLength%]
endlocal
exit /b 0
и дальше уже «танцевать» от полученного размера.
|
Как подправить скрипт, чтобы он дожидался окончания скачивания, только после этого распаковывал файл. Все операции в фоне.
Проблема в том, что скрипт пытается распаковать ещё не скаченный файл.
Код:
@echo off
setlocal enabledelayedexpansion
set sURL=http://www.giskirov.ru/download/download.php?book=4
del /q wget-log 2>nul
wget.exe -b -N -P "Update" "%sURL%" >nul&& (
findstr.exe /r /c:"^Server file no newer than local file .* -- not retrieving.$" "%~dp0wget-log" >nul &&(
Echo Обновления не требуется
) || (
Update\7z.exe x giskirov_lite.zip -o"%cd%\.." -y
Echo Программа обновлена
)
) || (
Echo Нет подключения интернет
)
|
Цитата:
Цитата sov44
Как подправить скрипт, чтобы он дожидался окончания скачивания, только после этого распаковывал файл. Все операции в фоне.
Проблема в том, что скрипт пытается распаковать ещё не скаченный файл. »
|
Убрать «-b» из:
Код:
wget.exe -b -N -P "Update" "%sURL%" …
|
нужно, чтобы качало в фоне. Насколько я понял из мануала, это возможно только с ключом -b
Я не хочу видеть окно консоли.
hidcon подавляет окно wget, но оставляет открытым окно батника. Если и на него ставить hincon, получится-ли?
|
sov44, Вы странный человек:
Цитата:
Цитата sov44
Проблема в том, что скрипт пытается распаковать ещё не скаченный файл. »
|
Цитата:
Цитата sov44
нужно, чтобы качало в фоне. »
|
Вы определитесь.
Зачем Вам нужна фоновая загрузка, если Вам в любом случае нужно ожидать завершения загрузки, а?
Цитата:
Цитата sov44
Я не хочу видеть окно консоли. »
|
Мда…
|
Страница загружается самая обычная. Ссылку Вы в загруженной странице не выделите, поскольку она формируется программно. Так что, на самом деле Вам нужен другой файл — скрипт, в котором содержатся ссылки:
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "usebackq tokens=3 delims==; " %%i in (
`@"%ProgramFiles%\GnuWin32\bin\wget.exe" -q -O- "http://kjkpub.s3.amazonaws.com/sumatrapdf/sumatralatest.js" ^| find.exe /i "var sumLatestExe = "`
) do set sUrl=%%~i
if defined sUrl echo [%sUrl%]
endlocal
exit /b 0
Постоянный ли у него адрес — не знаю. Смотрите, пробуйте.
|
Там же написано, где брать файл по ссылке:
Код:
https://www.picpick.org/releases/latest/picpick_inst.exe
Параметры? Ну, у меня по умолчанию стоят такие:
Код:
wget.exe --no-check-certificate --continue "https://www.picpick.org/releases/latest/picpick_inst.exe"
|
Iska, благодарю!
Чем Вы увидели прямую ссылку? В этот раз через Wireshark не удалось её увидеть.
|
Время: 17:38.
© OSzone.net 2001-