Windows Script Host(JScript):バイナリファイルをダウンロードするにはどうすればよいですか?
質問
Windows Script Host(JScript)を使用してファイルのダウンロードを自動化しようとしています。 adodb.streamには、HTTP URLを開き、応答本体をストリーミングできるようにするドキュメントが可能にするオープンな方法があります。
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):名前、範囲、または選択基準を一致させるオブジェクトまたはデータは、この操作の範囲内で見つかりませんでした。
解決
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ストリーム:
- http://www.w3schools.com/ado/ado_ref_stream.asp
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms675032.aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms680846.aspx
scripting.filesystemobject:
他のヒント
あなたは正しい軌道に乗っています。
xmlhttprequestオブジェクトを使用してサーバーと通信する必要があります。 Windowsスクリプトの「カール」のようなものです。データがリモートサーバーから読み取られたら、それを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
上記のコードをJavaScriptに変換しました。これは私のために働いているようです。キャッチブロックを呼び出し元に追加することをお勧めします。また、Asyncに変換されます。このコードを使用して、約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();
}
あなたのURLはこの形式である必要があります:
URL=scheme://server/folder