Windows Script Host(JScript):バイナリファイルをダウンロードするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4164400

  •  09-10-2019
  •  | 
  •  

質問

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ストリーム:

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top