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 to open a HTTP URL and stream the response body:
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();
But it bombs on the Open
call with
(null): Object or data matching the name, range, or selection criteria was not found within the scope of this operation.
JScript files are loaded with the scriptFile attribute of the VIEW element. They must be text files and should use the file name extension . js. If you have a JScript file that has the same name as the skin definition file, the JScript file will be loaded at the same time as the skin definition file.
To activate or deactivate the Windows Script Host, type regedit.exe in the Run box and press Enter to open the Registry Editor. In the right panel, you will see Enable. If you see 0 entries, it means that Windows Script Host access is disabled on your Windows. Double Click and in Data Value type 1 to activate it.
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:
Scripting.FileSystemObject:
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
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();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With