2010-11-12 61 views
4

我試圖用Windows Script Host(JScript)自動化文件下載。我看到ADODB.Stream有其文檔使它看起來像它應該能夠打開HTTP URL和流響應主體的開啓方式:Windows腳本宿主(jscript):我如何下載二進制文件?

var url = 'http://example.com/example.tar.gz'; 
var path = 'example.tar.gz'; 

var input = WScript.CreateObject('ADODB.Stream'); 

input.Open(url); 
input.SaveToFile(path); 
input.Close(); 

但它在Open電話與

炸彈(null):在此操作的範圍內找不到與名稱,範圍或選擇條件匹配的對象或數據。

+2

孩子們,任何以「我如何使用WSH ......」開頭的問題的唯一正確答案是*不*。這個問題只是我當時遇到的問題的冰山一角,決定使用python和它的win32api,雖然它不是恆星(文檔),但我能夠在窗口中自動化很多,而不會失去理智。 – 2013-06-25 15:28:34

回答

5

這是在JScript中的下載代碼。還添加了一些對API信息的引用。

var Source = WScript.Arguments.Item(0); 
var Target = WScript.Arguments.Item(1); 
var Object = WScript.CreateObject('MSXML2.XMLHTTP'); 

Object.Open('GET', Source, false); 
Object.Send(); 

if (Object.Status == 200) 
{ 
    // Create the Data Stream 
    var Stream = WScript.CreateObject('ADODB.Stream'); 

    // Establish the Stream 
    Stream.Open(); 
    Stream.Type = 1; // adTypeBinary 
    Stream.Write(Object.ResponseBody); 
    Stream.Position = 0; 

    // Create an Empty Target File 
    var File = WScript.CreateObject('Scripting.FileSystemObject'); 
    if (File.FileExists(Target)) 
    { 
     File.DeleteFile(Target); 
    } 

    // Write the Data Stream to the File 
    Stream.SaveToFile(Target, 2); // adSaveCreateOverWrite 
    Stream.Close(); 
} 

ADODB流:

Scripting.FileSystemObject的:

+0

我不能確認這實際上起作用,因爲我不再使用windows(hurray!),最後我仍然使用python。它看起來很健全,它是jScript,所以我接受它。 – 2013-06-25 15:22:24

+0

哦和+1的死靈。讚賞。 – 2013-06-25 15:22:55

0

您的網址需要在以下格式:

URL=scheme://server/folder 
+0

你願意解釋爲什麼嗎? – 2012-11-30 03:22:02

+1

請參閱[MSDN開放方法(ADO流)](http://msdn.microsoft.com/en-us/library/windows/desktop/ms680846.aspx)。這就是說源代碼應該是一個格式化爲'var url ='URL = http://example.com/example.tar.gz';'的格式的字符串;' – 2013-06-20 20:54:03

4

你在正確的軌道上。

您應該使用XMLHTTPRequest對象與服務器進行通信。這有點像Windows Script的「捲曲」。從遠程服務器讀取數據後,您可以將其寫入ADODB流並在腳本中對其進行處理。在你的情況下,使用FileSystemObject寫入文件看起來是最合乎邏輯的操作過程。

所以你的代碼可能看起來是這樣的:

' Set your settings 
strFileURL = "http://www.domain.com/file.zip" 
strSavePath = "C:\somefolder\" 

' Send an HTTP request for the file 
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP") 

objXMLHTTP.open "GET", strFileURL, false 
objXMLHTTP.send() 

' If the server responds with "OK"... 
If objXMLHTTP.Status = 200 Then 
    ' Create a stream object to write downloaded data to 
    Set objADOStream = CreateObject("ADODB.Stream") 
    objADOStream.Open 
    objADOStream.Type = 1 'adTypeBinary 

    objADOStream.Write objXMLHTTP.ResponseBody 
    objADOStream.Position = 0 

    ' Create an empty file on disk 
    Set objFso = Createobject("Scripting.FileSystemObject") 
    ' Make sure we don't have any name collision... 
    If objFso.Fileexists(strSavePath) Then objFSO.DeleteFile strSavePath 
    Set objFso = Nothing 

    ' Write the stream data to file 
    objADOStream.SaveToFile strSavePath 
    objADOStream.Close 
    Set objADOStream = Nothing 
End if 

Set objXMLHTTP = Nothing 
+5

這就是VBscript,而不是JScript – user2428118 2012-11-30 17:12:21

+0

upvoted的努力。 – 2013-06-25 15:23:18

2

將上述代碼轉換爲JavaScript。這似乎對我有用。建議添加一個try catch塊給調用者。另外,轉換爲異步。我已經使用這段代碼同時保存了大約90個文件。由於刪除文件(必要的覆蓋失敗)是同步的,因此最好將其移動到多個文件的單獨函數中。

function saveFile(sSourceUrl, sDestFile) { 
    var objXMLHTTP = new ActiveXObject("MSXML2.XMLHTTP"); 
    objXMLHTTP.onreadystatechange=function() { 
     if (objXMLHTTP.readyState === 4) { 
      var objADOStream = new ActiveXObject("ADODB.Stream"); 
      objADOStream.open(); 
      objADOStream.type = 1; // Binary 
      objADOStream.write(objXMLHTTP.ResponseBody); 
      objADOStream.position = 0; 
      objADOStream.saveToFile(sDestFile, 2); 
      objADOStream.close(); 
     } 
    }; 

    objXMLHTTP.open("GET", sSourceUrl, false); 
    objXMLHTTP.send(); 
} 
+1

使用'objADOStream.saveToFile(sDestFile,2); // adSaveCreateOverWrite'來擺脫文件刪除的需要。 – 2014-05-15 22:19:53

+0

感謝Ekkehard的幫助。 – Greg 2014-05-16 18:38:31

相關問題