Windows Script Host (jscript): how do i download a binary file?

前端 未结 4 642
[愿得一人]
[愿得一人] 2021-02-10 00:45

i\'m trying to automate a file download with Windows Script Host (JScript). i see ADODB.Stream has an Open method whose documentation makes it seem like it should be possible t

相关标签:
4条回答
  • 2021-02-10 00:55

    Converted the above code to JavaScript. This appears to work for me. Recommend adding a try catch block to the caller. Also, converted to async. I've used this code to save some 90 files at the same time. Since the delete file (necessary as the overwrite fails) is synchronous, it is better moved to a separate function for multiple files.

    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();
    }
    
    0 讨论(0)
  • 2021-02-10 00:59

    Here is the download code in JScript. Also added some references to API information.

    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 Stream:

    • 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:

    • http://www.w3schools.com/asp/asp_ref_filesystem.asp
    0 讨论(0)
  • 2021-02-10 01:03

    Your URL needs to be in this format:

    URL=scheme://server/folder
    
    0 讨论(0)
  • 2021-02-10 01:07

    You're on the right track.

    You should be using the XMLHTTPRequest Object to communicate with the server. It's sort of like "curl" for Windows Script. Once the data is read from the remote server, you can write it into an ADODB stream and manipulate it within your script. In your case, writing to a file using the FileSystemObject seems like the most logical course of action.

    So your script might look something like this:

    ' 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
    
    0 讨论(0)
提交回复
热议问题