PDA

Показать полную графическую версию : [решено] Загрузка файла из интернета посредством команд CMD


Страниц : [1] 2 3

volk1234
01-11-2009, 11:16
Привет.

Пишу утилиту которая в числе прочего устанавливает обновления Windows. Если оно есть в папке со скриптом все хорошо.
Но хотелось бы для уменьшения размера скрипта (дабы не распространять с ним обновление) чтобы скрипт в случае отсутствия обновлениий
запрашивал загрузку с заранее известного адреса. Желательно без доп. утилит.

Переменные-
%KBFile1% (уже заданное имя файла)
%KBFile2% (уже заданное имя файла)
%KB1_url% (соответственно путь для закачки файла обновлений 1)
%KB2_url% (соответственно путь для закачки файла обновлений 2)

avolkov2009
02-11-2009, 13:57
Про утилитку wget (http://ru.wikipedia.org/wiki/Wget) слыхали? Может помочь.

volk1234
02-11-2009, 14:46
Желательно без доп. утилит. »
Ну если нельзя без доп утилит, то вопрос снимаю.

amel27
03-11-2009, 09:38
Про утилитку wget слыхали? Может помочь »
тогда уж лучше curl, по крайней мере для этих задач

Ну если нельзя без доп утилит, то вопрос снимаю »штатно можно через VBS, который вызвать из CMD:

@Echo Off

Set ROOT=C:\TEST

Set KBFile1=autoit-v3.2.12.1-sfx.exe
Set KB_Url1=http://www.autoitscript.com/autoit3/files/archive/autoit/autoit-v3.2.12.1-sfx.exe

Set KBFile2=autoit-docs-v3.3.1.4-src.exe
Set KB_Url2=http://www.autoitscript.com/autoit3/files/beta/autoit/autoit-docs-v3.3.1.4-src.exe

Call :KB_TEST "%KBFile1%" "%KB_Url1%"
Call :KB_TEST "%KBFile2%" "%KB_Url2%"

Echo.
PAUSE

EXIT

:KB_TEST
<Nul Set /P $_X="%~1..."

If Exist "%ROOT%\%~1" Echo Ok& Exit /B
<Nul Set /P $_X=Loading

CScript //NoLogo "%~dpn0.vbs" "%ROOT%\%~1" "%~2"
Set ERR=%ErrorLevel%

<Nul Set /P $_X=
If %ERR% EQU 0 (Echo Ok ) Else Echo ERROR

Exit /B

If Wscript.Arguments.Count=2 Then
WScript.Quit(HTTPFileGet(Wscript.arguments.Item(1), Wscript.arguments.Item(0)))
Else
WScript.Quit(1)
End If

Function HTTPFileGet(strFileURL, strFileSave)
Dim objXMLHTTP, objADOStream, objFSO
HTTPFileGet = 1

Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
Set objADOStream = CreateObject("ADODB.Stream")
Set objFSO = Createobject("Scripting.FileSystemObject")

objXMLHTTP.Open "GET", strFileURL, False
objXMLHTTP.Send()

If objXMLHTTP.Status = 200 Then
objADOStream.Open
objADOStream.Type = 1

objADOStream.Write objXMLHTTP.ResponseBody
objADOStream.Position = 0

If objFSO.FileExists(strFileSave) Then objFSO.DeleteFile strFileSave

objADOStream.SaveToFile strFileSave
objADOStream.Close

HTTPFileGet = 0
End If
End Function

P.S. файла для примера взяты от балды, для работы треба XP SP2

volk1234
04-11-2009, 01:25
Я может невнимательно смотрел справку к curl, но как определить подключен ли к интернету компьютер ??
Ибо команда
curl -O http://.......file.exe
отрабатывает и при подключенном интернете и без него 0_o
только без интернета подключенного получается не файл, а пустышка.

Короче как определить подключен ли комп к интернету из cmd ?

amel27
04-11-2009, 08:28
volk1234, может использовать ключ "-I" ?
curl -I http://.......file.exe

volk1234
05-11-2009, 20:43
volk1234, может использовать ключ "-I" ? »

Не помогает. :(

amel27
06-11-2009, 07:00
volk1234, странно... у меня вроде работает:
@Echo Off
SetLocal EnableExtensions

Set CURL=%~dp0curl.exe

Set KBFile1=autoit-v3.2.12.1-sfx.exe
Set KB_Url1=http://www.autoitscript.com/autoit3/files/archive/autoit/autoit-v3.2.12.1-sfx.exe

Set KBFile2=autoit-docs-v3.3.1.4-src.exe
Set KB_Url2=http://www.autoitscript.com/autoit3/files/beta/autoit/autoit-docs-v3.3.1.4-src.exe

CALL :GET_PROXY

<Nul Set /P XYZ=URL "%KB_Url1%" Testing...
"%CURL%" -f -s -I "%KB_Url1%" %$X% >Nul
If ErrorLevel 1 (Echo ERROR:%ErrorLevel%) Else (Echo OK!)

<Nul Set /P XYZ=URL "%KB_Url2%" Testing...
"%CURL%" -f -s -I "%KB_Url2%" %$X% >Nul
If ErrorLevel 1 (Echo ERROR:%ErrorLevel%) Else (Echo OK!)

EXIT

:GET_PROXY
Set $X=&Set $R=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
For /F "Tokens=1,3" %%i In ('REG Query "%$R%"^|Find "Proxy"') Do Set %%i=%%j
If "%ProxyEnable%"=="0x1" Set $X=-x %ProxyServer%
GoTo :EOF

volk1234
06-11-2009, 14:23
Пишу просто
curl -f -s -I http://download.microsoft.com/download/1/B/3/1B331878-8AF9-4642-94F4-0B0B0A9DD14A/WindowsXP-KB967715-x86-ENU.exe
Ничего не скачивает

Пишу
curl -O http://download.microsoft.com/download/1/B/3/1B331878-8AF9-4642-94F4-0B0B0A9DD14A/WindowsXP-KB967715-x86-ENU.exe
Скачивает файл WindowsXP-KB967715-x86-ENU.exe

amel27
06-11-2009, 15:11
Ничего не скачивает »
логично, т.к. ключ "-I" только считывает параметры файла - в контексте вопроса о проверке его наличия по линку и проверке наличия интернета, скачать можно и так:
curl -f -# -O http://download.microsoft.com/download/1/B/3/1B331878-8AF9-4642-94F4-0B0B0A9DD14A/WindowsXP-KB967715-x86-ENU.exe

volk1234
08-11-2009, 18:12
Без подключения к интернету приведенная выше команда всеравно создает файл размером 4223 кб.

amel27
09-11-2009, 11:17
volk1234, так что мешает сначала проверить подключение с ключом "-I", а потом при успехе (отсутствии ошибки) уже запускать закачку?.... можно даже заранее считать размер файла, а потом по окончании закачки сверить и сделать вывод об успехе или неудаче

volk1234
11-11-2009, 00:10
Ну наверное лень разбиратся, почему не работает. И незнание как проверить с ошибкой ли закончилась попытка проверить хост.
Наверное буду использовать wget....
Просто у меня скрипт работает с этими файлами и их наличие критично.
Хотя ваш пример с проверкой url и сравниванием размера файла с удовольствием посмотрел бы :)
И позаимствовал бы...

amel27
11-11-2009, 04:29
volk1234, дык я выше давал примеры, еще вариант:

@Echo Off
SetLocal EnableExtensions

Set KBFile1=WindowsServer2003-KB967715-x86-ENU.exe
Set KB_Url1=http://download.microsoft.com/download/1/A/2/1A234937-9572-408D-ACC9-3F99915CAC67/%KBFile1%

CALL :GET_PROXY
CALL :GET_FILE "%KBFile1%" "%KB_Url1%"

EXIT

:GET_FILE
<Nul Set /P XYZ=Testing Connection...
curl -f -s -I "%~2" %$X%|Find " 200 OK" >Nul
If Not ErrorLevel 1 (Echo OK) Else Echo ERROR!& Exit /B 1

<Nul Set /P XYZ=Get File Size...
For /F "Tokens=2 Delims=: " %%i In (
'curl -f -s -I "%~2" %$X%^|Find "Content-Length:"') Do Set KBSize1=%%i
If Defined KBSize1 (Echo Content-Length: %KBSize1% Bytes) Else ERROR!& Exit /B 2

Echo Download "%~1"...
curl -f -# -O "%~2" %$X%
If Not Exist "%~1" Echo ERROR! Download not starting.& Exit /B 3
For %%i In ("%~1") Do (
If %%~zi EQU %KBSize1% Echo File Download Successfully!& Exit /B 0)
Echo ERROR! Download interrupted abnormally.& Echo.
Exit /B 4

:GET_PROXY
Set $X=&Set $R=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
For /F "Tokens=1,3" %%i In ('REG Query "%$R%"^|Find "Proxy"') Do Set %%i=%%j
If "%ProxyEnable%"=="0x1" Set $X=-x %ProxyServer%
GoTo :EOF

volk1234
11-11-2009, 21:39
Почемуто не отрабатывала часть скрипта с прокси (ругалась на синтаксис)-
-x %PROXY%

Убрал эту часть, оставил только загрузку с определением соединения. Странности с закачкой файла без соединения с интернетом остались.
Возможно это связанно с маршрутизацией в моей сети. Однако если отключить сетевую карту проверка соединения срабатывала.

Вот какую петрушку показала команда из скрипта вышеcurl -f -s -I "%~2"
Без соединения:
http://wiki.oszone.net/images/0/08/Noconnect.png

С VPN соединением с интернетом
http://wiki.oszone.net/images/0/04/Connect2.png

То есть по какой- то причине удается соединится с "неким" сервером и скачать текстовый файл размером 4 223 байта -
поэтому и не срабатывает ошибка и проверка на размер файла :shocked:

amel27
12-11-2009, 05:59
не отрабатывала часть скрипта с прокси »угу, напартачил немного в последнем варианте - исправил

Вот какую петрушку показала команда из скрипта выше »я не знаток HTML, но по ходу отвечает какой-то прокси HTML-страницей, которая впоследствии должна обрабатывается обозревателем... CURL очевидно не способен обрабатывать такие редиректы - только непосредственые подключения, у меня тоже были траблы с закачкой по линкам типа "http://www.site.com/cgi-bin/getfile.pl?dir/file.ext"

по какой- то причине удается соединится с "неким" сервером и скачать текстовый файл размером 4 223 байта -
поэтому и не срабатывает ошибка и проверка на размер файла »
может проще вбить ожидаемый размер файла в переменную и уже с ним сравнивать?.. маловероятно, что он изменится

volk1234
12-11-2009, 11:01
Можно еще проверять по веб вервру- IIS мало кто использует :))
Да и тип файла должен быть application а не текст.
А текст - это наверное страничка провайдера...

amel27
12-11-2009, 12:09
тип файла должен быть application а не текст »а это вариант :)
@Echo Off
SetLocal EnableExtensions

Set KBFile1=WindowsServer2003-KB967715-x86-ENU.exe
Set KB_Url1=http://download.microsoft.com/download/1/A/2/1A234937-9572-408D-ACC9-3F99915CAC67/%KBFile1%

CALL :GET_PROXY
CALL :GET_FILE "%KBFile1%" "%KB_Url1%"

EXIT

:GET_FILE
<Nul Set /P XYZ=Testing Connection...
curl -f -s -I "%~2" %$X%|Find " 200 OK" >Nul
If ErrorLevel 1 Echo ERROR [Not Responding]& Exit /B 1

For /F "Skip=1 Tokens=1* Delims=: " %%i In (
'curl -f -s -I "%~2" %$X%') Do Set %%i=%%j
If /I "%Content-Type%"=="application/octet-stream" (
Echo OK [%Content-Length% Bytes] ) Else Echo ERROR [Wrong Response]& Exit /B 2

Echo Downloading "%~1"...
curl -f -# -O "%~2" %$X%
If Not Exist "%~1" Echo ERROR [Download not starting].& Exit /B 3
For %%i In ("%~1") Do (
If %%~zi EQU %Content-Length% Echo File Download Successfully!& Exit /B 0)
Echo ERROR [Download interrupted abnormally]
Exit /B 4

:GET_PROXY
Set $X=&Set $R=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
For /F "Tokens=1,3" %%i In ('REG Query "%$R%"^|Find "Proxy"') Do Set %%i=%%j
If "%ProxyEnable%"=="0x1" Set $X=-x %ProxyServer%
GoTo :EOF

volk1234
12-11-2009, 14:58
Проверил на выделенке на работе - вроде работает. Еще проверю дома на VPN...,

А для чего ключи /B 0-4 ???

amel27
13-11-2009, 01:47
для чего ключи /B 0-4 ??? »
установка значения переменной окружения ERRORLEVEL при выходе из процедуры, т.е. 0 - успех, 1-4 - коды ошибок, для выбора альтернатив в основном скрипте сразу после "CALL :GET_FILE"




© OSzone.net 2001-2012