Windows 使用代理从 URL 批量下载文件

标签 windows batch-file download scripting

每天早上我必须安排从网上下载 xls 文件并将其保存到本地文件夹中。 我想制作一个 CMD 文件,然后使用 Windows 调度程序。

该文件始终具有相同的 URL,例如 www.example.com/myfile.xls

我找到了一些教程并截取了相关代码,但我的问题是我需要使用代理服务器(“proxy.mycompany.com”和端口“1234”)。

是否可以使用 CMD 文件来做到这一点,或者我需要转向其他解决方案(VB.net,...)?

最佳答案

我建议使用嵌入在 .cmd 中的 JScript

@set @tmpvar=1 /*
@echo off

echo Downloading...
call :download "http://download.qt.io/official_releases/jom/jom.zip" || echo Failed

echo Downloading using proxy...
call :download "http://download.qt.io/official_releases/jom/jom_1_1_1.zip" "206.128.191.77:8008" || echo Failed

goto :EOF

rem  Function :download
rem    %1 - URL
rem    %2 - [Proxy]
rem    %3 - [file name]
:download
cscript /nologo /e:jscript "%~f0" %*
exit /b %ERRORLEVEL%

*/

function getFileName(uri) {
    var re = /\/([^?/]+)(?:\?.+)?$/;
    var match = re.exec(uri);
    return match != null ? match[1] : "output";
}

try {

    var Source = WScript.Arguments.Item(0);
    var Proxy  = WScript.Arguments.Length > 1 ? WScript.Arguments.Item(1) : "";
    var Target = WScript.Arguments.Length > 2 ? WScript.Arguments.Item(2) : getFileName(Source);

    var Object = WScript.CreateObject('MSXML2.ServerXMLHTTP');
    if (Proxy.length > 0) {
        Object.setProxy(2/*SXH_PROXY_SET_PROXY*/, Proxy, "");
    }
    Object.open('GET', Source, false);
    Object.send();
    if (Object.status != 200) {
        WScript.Echo('Error:' + Object.status);
        WScript.Echo(Object.statusText);
        WScript.Quit(1);
    }

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

    var Stream = WScript.CreateObject('ADODB.Stream');
    Stream.Open();
    Stream.Type = 1/*adTypeBinary*/;
    Stream.Write(Object.responseBody);
    Stream.Position = 0;
    Stream.SaveToFile(Target, 2/*adSaveCreateOverWrite*/);
    Stream.Close();

} catch (e) {
    WScript.Echo("--------------------");
    WScript.Echo("Error " + (e.number & 0xFFFF) + "\r\n  " + e.description.replace(/[\r\n]*$/, "\r\n"));
    for (var i = 0; i < WScript.Arguments.length; ++i) {
        WScript.Echo("  arg" + (i+1) + ": " + WScript.Arguments(i));
    }
    WScript.Echo("--------------------");
    WScript.Quit(1);
}

关于Windows 使用代理从 URL 批量下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43258536/

相关文章:

CR+LF 与 LF 和 CR 之间的 C++ stdin 和 stdout 转换

windows - 从父批中杀死子批处理

windows - 如何在PowerShell中获取CPU功耗?

Android Glide 下载前显示

node.js - Firebase 云函数提供本地文件以供下载

objective-c - 当应用程序未激活时 iOS 后台下载

r - 如何从 R 中的串口读取数据

windows - 批处理 for 循环不迭代超过第一个条目

batch-file - 如何将 Perforce 同步命令的输出发送到文本文件

batch-file - 从文件名中删除特殊字符的脚本