2010-06-04 2 views
15

Ive получил VBS Script, который генерирует URL-адрес для загрузки файла с сервера в моей сети. Теперь мне нужно загрузить файл в «C: \ rWallpaper \ wallpaper.png», URL-адрес хранится в переменной «url»Загрузить файл с VBS

Id нравится работать как-то вроде wget on linux, просто загрузите и сохраните файл в указанное место.

ответ

29

Вы можете загрузить с помощью XMLHTTP и использовать поток ADO для записи двоичных данных;

dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP") 
dim bStrm: Set bStrm = createobject("Adodb.Stream") 
xHttp.Open "GET", "http://bla.com/xxx.png", False 
xHttp.Send 

with bStrm 
    .type = 1 '//binary 
    .open 
    .write xHttp.responseBody 
    .savetofile "c:\temp\xxx.png", 2 '//overwrite 
end with 
+0

Это работает и помог мне много, но вы должны указать имя цели. Проблема в том, что вы хотите использовать исходное имя файла, предложенное сервером. – Racky

+7

@Racky после '.send' (если сервер посчитает это), предлагаемое имя файла после« filename = »token доступно через' hdr = xHttp.getResponseHeader («Content-Disposition») ' –

6

выше ответ бросил ошибку Write to file failed. Code: 800A0BBC для меня, но это сработало:

HTTPDownload http://www.emagcloud.com/europeansealing/FSA_ESA_Compression_Packing_Technical_Manual_v3/pubData/source/images/pages/page10.jpg", "C:\" 

Где

Sub HTTPDownload(myURL, myPath) 
' This Sub downloads the FILE specified in myURL to the path specified in myPath. 
' 
' myURL must always end with a file name 
' myPath may be a directory or a file name; in either case the directory must exist 
' 
' Written by Rob van der Woude 
' http://www.robvanderwoude.com 
' 
' Based on a script found on the Thai Visa forum 
' http://www.thaivisa.com/forum/index.php?showtopic=21832 

    ' Standard housekeeping 
    Dim i, objFile, objFSO, objHTTP, strFile, strMsg 
    Const ForReading = 1, ForWriting = 2, ForAppending = 8 

    ' Create a File System Object 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    ' Check if the specified target file or folder exists, 
    ' and build the fully qualified path of the target file 
    If objFSO.FolderExists(myPath) Then 
     strFile = objFSO.BuildPath(myPath, Mid(myURL, InStrRev(myURL, "/") + 1)) 
    ElseIf objFSO.FolderExists(Left(myPath, InStrRev(myPath, "\") - 1)) Then 
     strFile = myPath 
    Else 
     WScript.Echo "ERROR: Target folder not found." 
     Exit Sub 
    End If 

    ' Create or open the target file 
    Set objFile = objFSO.OpenTextFile(strFile, ForWriting, True) 

    ' Create an HTTP object 
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 

    ' Download the specified URL 
    objHTTP.Open "GET", myURL, False 
    objHTTP.Send 

    ' Write the downloaded byte stream to the target file 
    For i = 1 To LenB(objHTTP.ResponseBody) 
     objFile.Write Chr(AscB(MidB(objHTTP.ResponseBody, i, 1))) 
    Next 

    ' Close the target file 
    objFile.Close() 
End Sub 

+0

Если принятый ответ не удалось с этой конкретной ошибкой проблема - это разрешения на запись в папку, что не так сложно решить. – Lankymart

+1

Вы правы, и я решил это, используя предоставленный код. –

+1

Ваш метод очень медленный, когда размер файла большой (например, 400k pdf, я использовал 20 секунд для загрузки) отмеченный ответ, который использует только 2 секунды для загрузки того же файла. –

0

Это сообщение устарело, но ошибка в ответе на код fisrt заключается в том, что вам нужны привилегии для записи на C :. Попробуйте на рабочем столе или% temp%, он работает.

3

В дополнение к Alex K ответ, я использовал следующее, если это поможет кому-то:

Определить объект

Set objWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1") 

вызовов Скачать ссылку с файлом (изображения в нашем случае)

URL = "https://www.grupya.com/public/assets/img/logo.png" 
objWinHttp.open "GET", URL, False 
objWinHttp.send "" 

Сохранение двоичных данных на диск

SaveBinaryData "c:\temp\my.png",objWinHttp.responseBody 

SaveBinaryData Функция

Function SaveBinaryData(FileName, Data) 

' adTypeText for binary = 1 
Const adTypeText = 1 
Const adSaveCreateOverWrite = 2 

' Create Stream object 
Dim BinaryStream 
Set BinaryStream = CreateObject("ADODB.Stream") 

' Specify stream type - we want To save Data/string data. 
BinaryStream.Type = adTypeText 

' Open the stream And write binary data To the object 
BinaryStream.Open 
BinaryStream.Write Data 

' Save binary data To disk 
BinaryStream.SaveToFile FileName, adSaveCreateOverWrite 

End Function 
+0

Работает как очарование; Toda'a –

Смежные вопросы