Показать полную графическую версию : [решено] Загрузка файла из интернета посредством команд CMD
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
Желательно без доп. утилит. »
Ну если нельзя без доп утилит, то вопрос снимаю.
Про утилитку 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 ?
volk1234, может использовать ключ "-I" ?
curl -I http://.......file.exe
volk1234
05-11-2009, 20:43
volk1234, может использовать ключ "-I" ? »
Не помогает. :(
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
Ничего не скачивает »
логично, т.к. ключ "-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 кб.
volk1234, так что мешает сначала проверить подключение с ключом "-I", а потом при успехе (отсутствии ошибки) уже запускать закачку?.... можно даже заранее считать размер файла, а потом по окончании закачки сверить и сделать вывод об успехе или неудаче
volk1234
11-11-2009, 00:10
Ну наверное лень разбиратся, почему не работает. И незнание как проверить с ошибкой ли закончилась попытка проверить хост.
Наверное буду использовать wget....
Просто у меня скрипт работает с этими файлами и их наличие критично.
Хотя ваш пример с проверкой url и сравниванием размера файла с удовольствием посмотрел бы :)
И позаимствовал бы...
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:
не отрабатывала часть скрипта с прокси »угу, напартачил немного в последнем варианте - исправил
Вот какую петрушку показала команда из скрипта выше »я не знаток HTML, но по ходу отвечает какой-то прокси HTML-страницей, которая впоследствии должна обрабатывается обозревателем... CURL очевидно не способен обрабатывать такие редиректы - только непосредственые подключения, у меня тоже были траблы с закачкой по линкам типа "http://www.site.com/cgi-bin/getfile.pl?dir/file.ext"
по какой- то причине удается соединится с "неким" сервером и скачать текстовый файл размером 4 223 байта -
поэтому и не срабатывает ошибка и проверка на размер файла »
может проще вбить ожидаемый размер файла в переменную и уже с ним сравнивать?.. маловероятно, что он изменится
volk1234
12-11-2009, 11:01
Можно еще проверять по веб вервру- IIS мало кто использует :))
Да и тип файла должен быть application а не текст.
А текст - это наверное страничка провайдера...
тип файла должен быть 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 ???
для чего ключи /B 0-4 ??? »
установка значения переменной окружения ERRORLEVEL при выходе из процедуры, т.е. 0 - успех, 1-4 - коды ошибок, для выбора альтернатив в основном скрипте сразу после "CALL :GET_FILE"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.