我怎样才能下载使用批处理文件的文件,而无需使用任何外部工具?下载使用、批处理文件、文件、工具

2023-09-02 10:20:23 作者:免贪

首先要澄清这个问题的目的是为HTTP(S)下载。对于FTP可能是我要问(并回答)另外一个问题。 这里是一些类似的问题 - 但我想更precise。

除了不包括外部工具,我想要的解决方案(S)是适用于最广泛的类型的Windows机器(包括XP,Win2003的,Vista中仍然有足够大的份额)。 另外,作为 WSH 是我preFER没有使用的临时文件,一切都将在一个蝙蝠文件(这是可能的两个JScript和VBScript)。

什么是可行的办法。

在纯批量解决方案的bitsadmin - 一个命令行工具 可每个Windows机器上。它不是pretty的方便,但是一个/唯一的选择在哪里 没有其他的脚本语言应该被使用。 使用WSH - 三种方法是可能的 - 的 WinHTTP的, MSXML2 .XMLHTTP , InternetExlorer.Application - 所有的人可访问的ActiveX 为了我怎么preFER them.WinHTTP和MSXML2.XMLHTTP对象 是pretty的在自己的能力相似,但WinHTTP的有 更stable.InternetExlorer.Application声誉,其实是 只是互联网浏览器通过ActiveX对象访问, 一些UI元素是不可避免的(是吗?),所以我会跳过这一项。 在使用.NET - 它可以创建与所有的混合批处理文件 三个默认的.NET编译器(Jscript.net,VB.Net,C#)与 Jscript.net没有多余的错误信息,所以我会preFER 它。如果我们忽略了一个事实,有一个编译的.exe所有code 是在一个文件中,因此按照我这个适合于要求:-) 。随着.NET我们可以使用System.Net.WebClient或 System.Net.HttpWebRequest(Web客户端依赖于它)或 System.Web.Htt prequest,但现在我只发布 System.Net.WebClient solution.And更相同的ActiveX对象 与WSH访问都可以在这里too.So真的有很多 途径dowanload与.Net.May的文件将在今后我会更新 我answer.Anyway只有Web客户端是专门为下载而设计的。 使用PowerShell的 - 具有相同的可能性,.NET,但少 机会要上,你可以meet.So我会跳过所有机器上安装 这一个了。 解决方案

在answers.All脚本应保存蝙蝠 / .CMD 扩展,并且可以直接用作批处理脚本

1 的bitsadmin :

简单的可能方式来使用它

 的bitsadmin /传输myDownloadJob /下载/优先级正常的http://downloadsrv/10mb.zip C: 10mb.zip
 

或(你最终会,如果你想添加凭据,代理服务器等需要这个。)

 关闭@echo
    SETLOCAL

    ::使用的bitsadmin工具下载文件
    ::的bitsadmin是不是在winXP的家庭版提供
    ::只有这样,才能下载与纯粹的批处理文件
   :下载

    如果%2EQU(
      拨打:帮助
      出口/ B 5
   )

   如果%1EQU(
      拨打:帮助
      退出/ B 6
   )
    设定URL =%〜1
    设置文件=%〜2
    REM ----
    如果%〜3NEQ(
        集/超时=%〜3
    ) 其他 (
        设置超时= 5
    )

    的bitsadmin /取消下载> NUL
    的bitsadmin /创建/下载下载> NUL
    调用的bitsadmin / addfile下载%URL%%CD%%文件%> NUL
    的bitsadmin /简历下载> NUL
    的bitsadmin / setproxysettings下载AUTODETECT> NUL

    集/一个尝试= 0
    :重复
    集/一个试图+ = 1
    如果%尝试%EQU10(
        回声超时
        ENDLOCAL
        退出/ B 1
    )
    的bitsadmin /资料下载/详细|找到状态:ERROR> NUL 2  - ;&放1安培;&安培; ENDLOCAL&功放;&安培;的bitsadmin /取消下载和放大器;&安培;呼应某种错误和放大器;&安培;出口/ B 2
    的bitsadmin /资料下载/详细|找到状态:已暂停> NUL 2  - ;&放1安培;&安培; ENDLOCAL&功放;&安培;的bitsadmin /取消下载和放大器;&安培;回声文件没有添加和放大器;&安培;退出/ B 3
    的bitsadmin /资料下载/详细|找到状态:TRANSIENT_ERROR> NUL 2  - ;&放1安培;&安培; ENDLOCAL&功放;&安培;的bitsadmin /取消下载和放大器;&安培;回声暂时错误和放大器;&安培;退出/ B 4
    的bitsadmin /资料下载/详细|找到状态:转职> NUL 2  - ;&放1安培;&安培;转到:整理

   W32TM /带状图/计算机:本地主机/时间:1 /的dataonly /样本:%超时%> NUL 2  - ;&功放; 1
    转到:重复
    :精加工
    的bitsadmin /完整下载> NUL
    回声下载完了
    ENDLOCAL
   GOTO:EOF

   :帮帮我
   回声%〜N0 URL文件[暂停]
   回声。
   回声网址 - 源下载
   回声文件 - 该文件将被存储在本地目录中的文件名
   回声超时 - 数字在每个检查之间秒,如果下载完成(企图是10)
   回声。
   GOTO:EOF
 
Key Launcher v1.00 英文绿色免费版 程序启动器 启动可执行文件批处理文件下载

2 WINHTTP和WSH (SSL /证书和代理选项得到了从来没有测试过...)

  @if(@X)==(@ Y)@end / * JScript的评论
    关闭@echo

    REM ::第一个参数是脚本的名称,因为它会被用于适当的帮助信息
    CSCRIPT // E:JScript中// NOLOGO%〜F0%〜NX0%*

    退出/ B%ERRORLEVEL%

@if(@X)==(@ Y)@end的JScript注释* /

//使用的资源
//http://www.$c$cproject.com/Tips/506439/Downloading-files-with-VBScript
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384058(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384055(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384059(v=vs.85).aspx

//全局变量和常量
变参= WScript.Arguments;
变种SCRIPTNAME = ARGS.Item(0);

VAR URL =;
VAR saveTo =;

变种用户= 0;
变种通= 0;

变种代理= 0;
VAR旁路= 0;
变种proxy_user = 0;
变种proxy_pass = 0;

变种证书= 0;

VAR力= TRUE;

// ActiveX对象
VAR WinHTTPObj =新的ActiveXObject(WinHttp.WinHtt prequest.5.1);
VAR FileSystemObj =新的ActiveXObject(Scripting.FileSystemObject的);
VAR AdoDBObj =新的ActiveXObject(的ADODB.Stream);

// Htt的prequest SetCredentials方法标志。
VAR HTT preQUEST_SETCREDENTIALS_FOR_SERVER = 0;
VAR HTT preQUEST_SETCREDENTIALS_FOR_PROXY = 1;

// Htt的prequest SetCredentials方法标志。
HTT preQUEST_PROXYSETTING_DEFAULT = 0;
HTT preQUEST_PROXYSETTING_ preCONFIG = 0;
HTT preQUEST_PROXYSETTING_DIRECT = 1;
HTT preQUEST_PROXYSETTING_PROXY = 2;

功能printHelp(){
    WScript.Echo(SCRIPTNAME + - 通过下载HTTP文件);
    WScript.Echo(SCRIPTNAME +URL localfile [-force YSE |无] [-user用户名-password密码] [-proxy访问代理服务器:端口] [-bypass bypass_list]);
    WScript.Echo([-proxyuser proxy_username -proxypassword PROXY_PASSWORD] [-certificate certificateString]);
    WScript.Echo( - 力 - 决定不或覆盖,如果当地存在);
    WScript.Echo(访问代理服务器:端口 - 代理服务器);
    WScript.Echo(bypass-绕过列表);
    WScript.Echo(proxy_user,PROXY_PASSWORD  - 为代理服务器凭据);
    WScript.Echo(用户,密码 - 服务器证书);
    WScript.Echo(证书 - 的SSL证书位置);
    WScript.Echo(示例:);
    WScript.Echo(SCRIPTNAME +http://somelink.com/somefile.zip C:\ somefile.zip -certificate LOCAL_MACHINE \ \个人我中间层证书);
}

功能parseArgs(){
    //
    如果(ARGS.Length 3;){
        WScript.Echo(论据不足);
        printHelp();
        WScript.Quit(43);
    }
    网址= ARGS.Item(1);
    saveTo = ARGS.Item(2);

    如果(ARGS.Length%2!= 1){
        WScript.Echo(非法参数);
        printHelp();
        WScript.Quit(44);
    }

    对于(VAR I = 3; I< ARGS.Length-1; ​​i = i + 2){
        如果(ARGS.Item(我).toLowerCase == - 力和放大器;&安培; ARGS.Item第(i + 1)=='无'){
            力= FALSE;
        }

        如果(ARGS.Item(我).toLowerCase == - 用户){
            用户= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 密码){
            通= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 代理){
            代理= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 搭桥){
            旁路= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == -  PROXYUSER){
            proxy_user = ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 的proxyPassword){
            proxy_pass = ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 证书){
            证书= ARGS.Item第(i + 1);
        }
    }
}

stripTrailingSlash =功能(路径){
    而(path.substr(path.length  -  1,path.length)=='\'){
        PATH = path.substr(0,path.length  -  1);
    }
    返回路径;
}

功能existsItem(路径){
    返回FileSystemObj.FolderExists(路径)|| FileSystemObj.FileExists(路径);
}

功能deleteItem(路径){
    如果(FileSystemObj.FileExists(路径)){
        FileSystemObj.DeleteFile(路径);
        返回true;
    }否则,如果(FileSystemObj.FolderExists(路径)){
        FileSystemObj.DeleteFolder(stripTrailingSlash(路径));
        返回true;
    } 其他 {
        返回false;
    }
}

功能WRITEFILE(文件名,数据){
    AdoDBObj.Type = 1;
    AdoDBObj.Open();
    AdoDBObj.Position = 0;
    AdoDBObj.Write(数据);
    AdoDBObj.SaveToFile(文件名,2);
    AdoDBObj.Close();
}

功能下载(URL,文件){
    如果(力和安培;&安培; existsItem(文件)){
        如果(!deleteItem(文件)){
            WScript.Echo(无法删除+文件);
            WScript.Quit(8);
        }
    }否则如果(existsItem(文件)){
        WScript.Echo(项目+文件+已经存在);
        WScript.Quit(9);
    }

    如果(代理= 0&放大器;!&安培;!搭桥= 0){
        WinHTTPObj.SetProxy(HTT preQUEST_PROXYSETTING_PROXY,代理,旁路);
    }

    如果(代理!= 0){
        WinHTTPObj.SetProxy(HTT preQUEST_PROXYSETTING_PROXY,代理);
    }

    如果(用户= 0&放大器;!&安培;!通过= 0){
         WinHTTPObj.SetCredentials(用户,传球,HTT preQUEST_SETCREDENTIALS_FOR_SERVER);
    }

    如果(proxy_user = 0&安培;!&安培;!proxy_pass = 0){
        WinHTTPObj.SetCredentials(proxy_user,proxy_pass,HTT preQUEST_SETCREDENTIALS_FOR_PROXY);
    }

    如果(证书!= 0){
        WinHTTPObj.SetClientCertificate(证书);
    }

    WinHTTPObj.Open(GET,网址,虚假);
    WinHTTPObj.Send();
    VAR状态= WinHTTPObj.Status

    开关(状态){
        案例200:
            WScript.Echo(状态:200 OK);
            打破;
        案例401:
            WScript.Echo(状态:401未授权);
            WScript.Echo(检查是否正确的用户名和密码都提供了);
            WScript.Quit(401);
            打破;
        案例407:
            Wscript.Echo(状态:407需要代理身份验证);
            Wscript.Echo(检查是否正确的代理用户名和密码都提供了);
            WScript.Quit(407);
            打破;
        默认:
            Wscript.Echo(状态:+状态);
            WScript.Echo(尝试,以帮助自己 - > https://en.wikipedia.org/wiki/List_of_HTTP_status_$c$cs);
            WScript.Quit(状态);
    }
    WRITEFILE(文件,WinHTTPObj.ResponseBody);
}

函数main(){
    parseArgs();
    下载(网址,saveTo);
}

主要();
 

3 MSXML2.XMLHTTP和WSH (最好用的WinHTTP)(SSL /证书和代理选项得到了从来没有测试过...)

  @if(@X)==(@ Y)@end / * JScript的评论
    关闭@echo

    REM ::第一个参数是脚本的名称,因为它会被用于适当的帮助信息
    CSCRIPT // E:JScript中// NOLOGO%〜F0%〜NX0%*

    退出/ B%ERRORLEVEL%

@if(@X)==(@ Y)@end的JScript注释* /

//使用的资源
//http://www.$c$cproject.com/Tips/506439/Downloading-files-with-VBScript
//http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
//https://msdn.microsoft.com/en-us/library/ie/ms535874(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/aa923283.aspx
//https://msdn.microsoft.com/en-us/library/ms759148(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/ms759148(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/ms760236(v=vs.85).aspx
//http://stackoverflow.com/questions/20712635/providing-authentication-info-via-msxml2-serverxmlhttp
//https://msdn.microsoft.com/en-us/library/ms763680(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/ms757849(v=vs.85).aspx
//http://fm4dd.com/programming/shell/microsoft-vbs-http-download.htm
//http://stackoverflow.com/questions/11573022/vba-serverxmlhttp-https-request-with-self-signed-certificate
//http://www.qtcentre.org/threads/44629-Using-XMLHtt$p$pquest-for-HTTPS-Post-to-server-with-SSL-certificate

//全局变量和常量
变参= WScript.Arguments;
变种SCRIPTNAME = ARGS.Item(0);

VAR URL =;
VAR saveTo =;

变种用户= 0;
变种通= 0;

变种代理= 0;
VAR旁路=;
变种proxy_user = 0;
变种proxy_pass = 0;

变种证书= 0;

VAR力= TRUE;

// ActiveX对象
//使用正确版本的MSXML
/ *变种的ProgID = ['Msxml2.DOMDocument.6.0','Msxml2.DOMDocument.5.0','Msxml2.DOMDocument.4.0','Msxml2.DOMDocument.3.0','Msxml2.DOMDocument']
对于(VAR I = 0; I< progIDs.length;我++){
    尝试 {
        VAR XMLHTTPObj =新的ActiveXObject(的ProgID [I]);
    }赶上(前){
    }
}

如果typeof运算XMLHTTPObj ===未定义{
    WScript.Echo(您正在使用过于古老的窗户,或者你没有安装IE);
    WScript.Quit(1);
} * /

VAR XMLHTTPObj =新的ActiveXObject(MSXML2.XMLHTTP);
VAR FileSystemObj =新的ActiveXObject(Scripting.FileSystemObject的);
VAR AdoDBObj =新的ActiveXObject(的ADODB.Stream);


功能printHelp(){
    WScript.Echo(SCRIPTNAME + - 通过下载HTTP文件);
    WScript.Echo(SCRIPTNAME +URL localfile [-force YSE |无] [-user用户名-password密码] [-proxy访问代理服务器:端口-bypass bypass_list]);
    WScript.Echo([-proxyuser proxy_username -proxypassword PROXY_PASSWORD] [-certificate certificateString]);
    WScript.Echo( - 力 - 决定不或覆盖,如果当地存在);
    WScript.Echo(访问代理服务器:端口 - 代理服务器);
    WScript.Echo(bypass-绕过列表可以\,如果你不需要它);
    WScript.Echo(proxy_user,PROXY_PASSWORD  - 为代理服务器凭据);
    WScript.Echo(用户,密码 - 服务器证书);
    WScript.Echo(证书 - 的SSL证书位置);
    WScript.Echo(示例:);
    WScript.Echo(SCRIPTNAME +http://somelink.com/somefile.zip C:\ somefile.zip -certificate LOCAL_MACHINE \ \个人我中间层证书);
}

功能parseArgs(){
    //
    如果(ARGS.Length 3;){
        WScript.Echo(论据不足);
        printHelp();
        WScript.Quit(43);
    }
    网址= ARGS.Item(1);
    saveTo = ARGS.Item(2);

    如果(ARGS.Length%2!= 1){
        WScript.Echo(非法参数);
        printHelp();
        WScript.Quit(44);
    }

    对于(VAR I = 3; I< ARGS.Length-1; ​​i = i + 2){
        如果(ARGS.Item(我).toLowerCase == - 力和放大器;&安培; ARGS.Item第(i + 1)=='无'){
            力= FALSE;
        }

        如果(ARGS.Item(我).toLowerCase == - 用户){
            用户= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 密码){
            通= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 代理){
            代理= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 搭桥){
            旁路= ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == -  PROXYUSER){
            proxy_user = ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 的proxyPassword){
            proxy_pass = ARGS.Item第(i + 1);
        }

        如果(ARGS.Item(我).toLowerCase == - 证书){
            证书= ARGS.Item第(i + 1);
        }
    }
}

功能existsItem(路径){
    返回FileSystemObj.FolderExists(路径)|| FileSystemObj.FileExists(路径);
}

stripTrailingSlash =功能(路径){
    而(path.substr(path.length  -  1,path.length)=='\'){
        PATH = path.substr(0,path.length  -  1);
    }
    返回路径;
}

功能deleteItem(路径){
    如果(FileSystemObj.FileExists(路径)){
        FileSystemObj.DeleteFile(路径);
        返回true;
    }否则,如果(FileSystemObj.FolderExists(路径)){
        FileSystemObj.DeleteFolder(stripTrailingSlash(路径));
        返回true;
    } 其他 {
        返回false;
    }
}

功能WRITEFILE(文件名,数据){
    AdoDBObj.Type = 1;
    AdoDBObj.Open();
    AdoDBObj.Position = 0;
    AdoDBObj.Write(数据);
    AdoDBObj.SaveToFile(文件名,2);
    AdoDBObj.Close();
}

功能下载(URL,文件){
    如果(力和安培;&安培; existsItem(文件)){
        如果(!deleteItem(文件)){
            WScript.Echo(无法删除+文件);
            WScript.Quit(8);
        }
    }否则如果(existsItem(文件)){
        WScript.Echo(项目+文件+已经存在);
        WScript.Quit(9);
    }



    如果(代理= 0&放大器;!&安培;!搭桥=){
        //https://msdn.microsoft.com/en-us/library/ms760236(v=vs.85).aspx
        XMLHTTPObj.setProxy(SXH_PROXY_SET_DIRECT,代理,旁路);
    }否则如果(代理!= 0){
        XMLHTTPObj.setProxy(SXH_PROXY_SET_DIRECT,代理,);
    }



    如果(proxy_user = 0&安培;!&安培;!proxy_pass = 0){
        //https://msdn.microsoft.com/en-us/library/ms763680(v=vs.85).aspx
        XMLHTTPObj.setProxyCredentials(proxy_user,proxy_pass);
    }

    如果(证书!= 0){
        //https://msdn.microsoft.com/en-us/library/ms763811(v=vs.85).aspx
        WinHTTPObj.setOption(3,证书);
    }

    如果(用户= 0&放大器;!&安培;!通过= 0){
        //https://msdn.microsoft.com/en-us/library/ms757849(v=vs.85).aspx
         XMLHTTPObj.Open(GET,网址,虚假的,用户通过);
    } 其他 {
        XMLHTTPObj.Open(GET,网址,虚假);
    }



    XMLHTTPObj.Send();
    VAR状态= XMLHTTPObj.Status

    开关(状态){
        案例200:
            WScript.Echo(状态:200 OK);
            打破;
        案例401:
            WScript.Echo(状态:401未授权);
            WScript.Echo(检查是否正确的用户名和密码都提供了);
            WScript.Quit(401);
            打破;
        案例407:
            Wscript.Echo(状态:407需要代理身份验证);
            Wscript.Echo(检查是否正确的代理用户名和密码都提供了);
            WScript.Quit(407);
            打破;
        默认:
            Wscript.Echo(状态:+状态);
            WScript.Echo(尝试,以帮助自己 - > https://en.wikipedia.org/wiki/List_of_HTTP_status_$c$cs);
            WScript.Quit(状态);
    }
    WRITEFILE(文件,XMLHTTPObj.ResponseBody);
}

函数main(){
    parseArgs();
    下载(网址,saveTo);
}
主要();
 

4 .NET和Web客户端(这里没有SSL option.Will尝试添加它。丙氧基选择从来没有测试过)

  @if(@X)==(@ Y)@end / * JScript的评论
关闭@echo
SETLOCAL

FOR / F令牌= * delims =%% V IN('DIR / B / S / A:-d / O:-n的%SystemRoot% Microsoft.NET 框架 *器jsc.exe')办(
   集JSC = %% V
)

::如果不存在%〜n0.exe(
    %JSC%/ NOLOGO /out:"%~n0.exe%〜dpsfnx0
::)

 %〜n0.exe%*

ENDLOCAL和放大器;退出/ B%ERRORLEVEL%


* /

// TODO SSL支持
// TODO更好的帮助信息
如果本地文件存在// TODO检查


导入系统;
进口System.Net.WebClient;
进口System.Net.NetworkCredential;
进口System.Net.WebProxy;
进口的System.Uri;
进口System.Security.Cryptography.X509Certificates;

VAR参数:字符串[] = Environment.GetCommandLineArgs();

VAR URL = 0;
变种TOFILE = 0;
VAR力= TRUE;

变种用户= 0;
VAR密码= 0;

变种代理= 0;
VAR旁路= 0;
变种proxy_user = 0;
变种proxy_pass = 0;

变种证书= 0;

功能printHelp(){
    Console.WriteLine(参数[0] +下载从URL到文件);
    Console.WriteLine(参数[0] +<网址><文件> [-user用户-password密码] [-proxy代理] [-proxy_user proxy.user -proxy_pass proxy.pass]);

}

功能parseArgs(){

    如果(与arguments.length 3;){
        Console.WriteLine(参​​数错误);
        printHelp();
        Environment.Exit(1);
    }

    如果(的arguments.length%2!= 1){
        Console.WriteLine(错号参数);
        printHelp();
        Environment.Exit(2);
    }

    网址=参数[1];
    TOFILE =参数[2];

    对于(VAR I = 3; I<与arguments.length-1; ​​i = i + 2){
        VAR精氨酸=参数[I] .ToLower();
        开关(ARG){
            案 - 用户:
                用户=参数[1 + 1];
                打破;
            案-password:
                密码=参数[I + 1];
                打破;
            案-proxy:
                代理=参数[I + 1];
                打破;
            案-proxy_user:
                proxy_user =参数[I + 1];
                打破;
            案-proxy_pass:
                proxy_pass =参数[I + 1];
                打破;
            案-bypass:
                旁路= [参数[I + 1]];
                打破;
            / *案-certificate:
                证书=参数[1 + 1];
                打破;*/
            默认:
                Console.WriteLine(无效参数+参数[I]);
                printHelp();
                Environment.Exit(3);
        }
    }

}

功能下载(){
    VAR的客户:System.Net.WebClient =新System.Net.WebClient();

    如果(用户= 0&放大器;!&放大器;密码= 0){
        client.Credentials =新System.Net.NetworkCredential(约翰福音,password1234!);
    }

    如果(代理!= 0){
        VAR webproxy =新System.Net.WebProxy();
        webproxy.Address =新的URI(代理);
        如果(proxy_user = 0&安培;!&安培;!proxy_pass = 0){
            webproxy.Credentials =新System.Net.NetworkCredential(proxy_user,proxy_pass);
        }
        webproxy.UseDefaultCredentials = FALSE;

        如果(旁路!= 0){
            webproxy.BypassList =绕行;
            webproxy.BypassProxyOnLocal = FALSE;
        }
        client.Proxy = webproxy;
    }

    尝试 {
        client.DownloadFile(参数[1],参数[2]);
    }赶上(五){
        Console.BackgroundColor = ConsoleColor.Green;
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(+参数[1] +到+参数[2] +检查网络地址是有效的,ñ与下载nProblem);
        Console.ResetColor();
        Environment.Exit(5);
    }
}

 parseArgs();
 下载();
 

First to clarify this question is aimed to HTTP(s) download .For FTP may be I'll ask (and answer) another question. Here are some similar questions - but I want to be more precise .

Besides excluding external tools I want the solution(s) to be applicable for the widest possible types of windows machines (including XP,Win2003,Vista which still have big enough share). Also as WSH is one of the possible options I prefer no using of temp files and everything to be packed in a single .bat file (which is possible with both jscript and vbscript).

What are possible approaches.

"Pure" batch solution with BITSADMIN - a command line utility available on every windows machine .It's not pretty convenient but is an/the only option where no other scripting language should be used. Using WSH - Three approaches are possible - WinHTTP , MSXML2.XMLHTTP ,InternetExlorer.Application - all of them are accessible ActiveX objects in order of how I prefer them.WinHTTP and MSXML2.XMLHTTP are pretty similar in their capabilities but WinHTTP has a reputation of more stable.InternetExlorer.Application is in fact just the Internet explorer accessible through ActiveX object and some UI elements are unavoidable (are they?) so I'll skip this one. Using .NET - It's possible to create a hybrid batch file with all the three default .NET compilers (Jscript.net , VB.Net , C#) with Jscript.net there is no redundant error messages so I'll prefer it.If we ignore the fact that there's a compiled .exe all the code is in one file ,so according to me this fits in the requirements :-) .With .NET we can use System.Net.WebClient or System.Net.HttpWebRequest (the WebClient relies on it) or System.Web.HttpRequest , but for now I'll post only System.Net.WebClient solution.And even more same ActiveX objects accessible with WSH are available here too.So there are really many ways to dowanload a file with .Net.May be in the future I'll update my answer.Anyway only the Webclient is especially designed for download. Using powershell - has same possibilities as .NET but with less chances to be installed on all machines you can meet.So I'll skip this one too.

解决方案

The answers.All scripts should be saved with .bat/.cmd extensions and can be used directly as batch scripts.

1 Bitsadmin :

simplest possible way to use it

bitsadmin /transfer myDownloadJob /download /priority normal http://downloadsrv/10mb.zip c:10mb.zip

Or (you eventually will need this if you want to add credentials , proxy and etc.)

   @echo off
    setlocal

    :: uses bitsadmin utility to download a file
    :: bitsadmin is not available in winXP Home edition
    :: the only way to download a file with 'pure' batch
   :download

    if "%2" equ "" (
      call :help
      exit /b 5
   )

   if "%1" equ "" (
      call :help
      exit /b 6
   )
    set url=%~1
    set file=%~2
    rem ----
    if "%~3" NEQ "" (
        set /A timeout=%~3
    ) else (
        set timeout=5
    )

    bitsadmin /cancel download >nul
    bitsadmin /create /download download >nul 
    call bitsadmin /addfile download "%url%" "%CD%%file%" >nul
    bitsadmin /resume download >nul 
    bitsadmin /setproxysettings download AUTODETECT >nul

    set /a attempts=0
    :repeat
    set /a attempts +=1
    if "%attempts%" EQU "10" (
        echo TIMED OUT
        endlocal
        exit /b 1
    )
    bitsadmin /info download /verbose | find  "STATE: ERROR"  >nul 2>&1 && endlocal &&  bitsadmin /cancel download && echo SOME KIND OF ERROR && exit /b 2
    bitsadmin /info download /verbose | find  "STATE: SUSPENDED" >nul 2>&1 && endlocal &&  bitsadmin /cancel download &&echo FILE WAS NOT ADDED && exit /b 3
    bitsadmin /info download /verbose | find  "STATE: TRANSIENT_ERROR" >nul 2>&1 && endlocal &&  bitsadmin /cancel download &&echo TRANSIENT ERROR && exit /b 4
    bitsadmin /info download /verbose | find  "STATE: TRANSFERRED" >nul 2>&1 && goto :finishing 

   w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:%timeout%  >nul 2>&1
    goto :repeat
    :finishing 
    bitsadmin /complete download >nul
    echo download finished
    endlocal
   goto :eof

   :help
   echo %~n0 url file [timeout]
   echo.
   echo  url - the source for download
   echo  file - file name in local directory where the file will be stored
   echo  timeout - number in seconds between each check if download is complete (attempts are 10)
   echo.
   goto :eof

2 WinHttp and WSH (SSL/certificate and Proxy options have been never tested ...)

@if (@X)==(@Y) @end /* JScript comment
    @echo off

    rem :: the first argument is the script name as it will be used for proper help message
    cscript //E:JScript //nologo "%~f0" "%~nx0" %*

    exit /b %errorlevel%

@if (@X)==(@Y) @end JScript comment */

// used resources
//http://www.codeproject.com/Tips/506439/Downloading-files-with-VBScript
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384058(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384055(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384059(v=vs.85).aspx

// global variables and constants
var ARGS = WScript.Arguments;
var scriptName=ARGS.Item(0);

var url="";
var saveTo="";

var user=0;
var pass=0;

var proxy=0;
var bypass=0;
var proxy_user=0;
var proxy_pass=0;

var certificate=0;

var force=true;

//ActiveX objects
var WinHTTPObj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
var FileSystemObj = new ActiveXObject("Scripting.FileSystemObject");
var AdoDBObj = new ActiveXObject("ADODB.Stream");

// HttpRequest SetCredentials flags.
var  HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
var  HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1;

// HttpRequest SetCredentials flags.
HTTPREQUEST_PROXYSETTING_DEFAULT   = 0;
HTTPREQUEST_PROXYSETTING_PRECONFIG = 0;
HTTPREQUEST_PROXYSETTING_DIRECT    = 1;
HTTPREQUEST_PROXYSETTING_PROXY     = 2;

function printHelp(){
    WScript.Echo(scriptName + " - downloads a file through HTTP");
    WScript.Echo(scriptName + " url localfile [-force yse|no] [-user username -password password] [-proxy proxyserver:port] [-bypass bypass_list]");
    WScript.Echo("                          [-proxyuser proxy_username -proxypassword proxy_password] [-certificate certificateString]");
    WScript.Echo("-force  - decide to not or to overwrite if the local exists");
    WScript.Echo("proxyserver:port - the proxy server");
    WScript.Echo("bypass- bypass list");
    WScript.Echo("proxy_user , proxy_password - credentials for proxy server");
    WScript.Echo("user , password - credentials for the server");
    WScript.Echo("certificate - location of SSL certificate");
    WScript.Echo("Example:");
    WScript.Echo(scriptName +" http://somelink.com/somefile.zip c:\somefile.zip -certificate "LOCAL_MACHINE\Personal\My Middle-Tier Certificate"");    
}

function parseArgs(){
    //
    if (ARGS.Length < 3) {
        WScript.Echo("insufficient arguments");
        printHelp();
        WScript.Quit(43);
    }
    url=ARGS.Item(1);
    saveTo=ARGS.Item(2);

    if(ARGS.Length % 2 != 1) {
        WScript.Echo("illegal arguments");
        printHelp();
        WScript.Quit(44);
    }

    for (var i=3;i<ARGS.Length-1;i=i+2){
        if(ARGS.Item(i).toLowerCase=="-force" && ARGS.Item(i+1)=='no'){
            force=false;
        }

        if(ARGS.Item(i).toLowerCase=="-user"){
            user=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-password"){
            pass=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-proxy"){
            proxy=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-bypass"){
            bypass=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-proxyuser"){
            proxy_user=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-proxypassword"){
            proxy_pass=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-certificate"){
            certificate=ARGS.Item(i+1);
        }
    }
}

stripTrailingSlash = function(path){
    while (path.substr(path.length - 1,path.length) == '\') {
        path=path.substr(0, path.length - 1);
    }
    return path;
}

function existsItem(path){
    return FileSystemObj.FolderExists(path)||FileSystemObj.FileExists(path);
}

function deleteItem(path){
    if (FileSystemObj.FileExists(path)){
        FileSystemObj.DeleteFile(path);
        return true;
    } else if (FileSystemObj.FolderExists(path) ) {
        FileSystemObj.DeleteFolder(stripTrailingSlash(path));
        return true;
    } else {
        return false;
    }
}

function writeFile(fileName,data ){
    AdoDBObj.Type = 1;       
    AdoDBObj.Open();
    AdoDBObj.Position=0;
    AdoDBObj.Write(data);
    AdoDBObj.SaveToFile(fileName,2);
    AdoDBObj.Close();   
}

function download( url,file){
    if (force && existsItem(file)){
        if(!deleteItem(file)){
            WScript.Echo("Unable to delete "+ file);
            WScript.Quit(8);
        }
    }else if (existsItem(file)){
        WScript.Echo("Item " + file + " already exist");
        WScript.Quit(9);
    }

    if (proxy!=0 && bypass!=0  ) {
        WinHTTPObj.SetProxy(HTTPREQUEST_PROXYSETTING_PROXY,proxy,bypass);
    }

    if (proxy!=0 ) {
        WinHTTPObj.SetProxy(HTTPREQUEST_PROXYSETTING_PROXY,proxy);
    }

    if (user!=0 && pass!=0){
         WinHTTPObj.SetCredentials(user,pass,HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
    }

    if (proxy_user!=0 && proxy_pass!=0 ) {
        WinHTTPObj.SetCredentials(proxy_user,proxy_pass,HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
    }

    if(certificate!=0) {
        WinHTTPObj.SetClientCertificate(certificate);
    }

    WinHTTPObj.Open('GET',url,false);
    WinHTTPObj.Send();
    var status=WinHTTPObj.Status

    switch(status){
        case 200:
            WScript.Echo("Status: 200 OK");
            break;
        case 401:
            WScript.Echo("Status: 401 Unauthorized");
            WScript.Echo("Check if correct user and password were provided");
            WScript.Quit(401);
            break;
        case 407:
            Wscript.Echo("Status:407 Proxy Authentication Required");
            Wscript.Echo("Check if correct proxy user and password were provided");
            WScript.Quit(407);
            break;
        default:
            Wscript.Echo("Status: "+status);
            WScript.Echo("Try to help yourself -> https://en.wikipedia.org/wiki/List_of_HTTP_status_codes");
            WScript.Quit(status);
    }
    writeFile(file,WinHTTPObj.ResponseBody);
}

function main(){
    parseArgs();
    download(url,saveTo);
}

main();

3 MSXML2.XMLHTTP and WSH (better use WinHTTP)(SSL/certificate and Proxy options have been never tested ...)

@if (@X)==(@Y) @end /* JScript comment
    @echo off

    rem :: the first argument is the script name as it will be used for proper help message
    cscript //E:JScript //nologo "%~f0" "%~nx0" %*

    exit /b %errorlevel%

@if (@X)==(@Y) @end JScript comment */

// used resources
//http://www.codeproject.com/Tips/506439/Downloading-files-with-VBScript
//http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
//https://msdn.microsoft.com/en-us/library/ie/ms535874(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/aa923283.aspx
//https://msdn.microsoft.com/en-us/library/ms759148(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/ms759148(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/ms760236(v=vs.85).aspx
//http://stackoverflow.com/questions/20712635/providing-authentication-info-via-msxml2-serverxmlhttp
//https://msdn.microsoft.com/en-us/library/ms763680(v=vs.85).aspx
//https://msdn.microsoft.com/en-us/library/ms757849(v=vs.85).aspx
//http://fm4dd.com/programming/shell/microsoft-vbs-http-download.htm
//http://stackoverflow.com/questions/11573022/vba-serverxmlhttp-https-request-with-self-signed-certificate
//http://www.qtcentre.org/threads/44629-Using-XMLHttpRequest-for-HTTPS-Post-to-server-with-SSL-certificate

// global variables and constants
var ARGS = WScript.Arguments;
var scriptName=ARGS.Item(0);

var url="";
var saveTo="";

var user=0;
var pass=0;

var proxy=0;
var bypass="";
var proxy_user=0;
var proxy_pass=0;

var certificate=0;

var force=true;

//ActiveX objects
//Use the right version of MSXML
/*var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.5.0', 'Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument' ]
for (var i = 0; i < progIDs.length; i++) {
    try {
        var XMLHTTPObj = new ActiveXObject(progIDs[i]);
    }catch (ex) {       
    }
}

if typeof  XMLHTTPObj === 'undefined'{
    WScript.Echo ("You are using too ancient windows or you have no installed IE");
    WScript.Quit(1);
}*/

var XMLHTTPObj = new ActiveXObject("MSXML2.XMLHTTP");
var FileSystemObj = new ActiveXObject("Scripting.FileSystemObject");
var AdoDBObj = new ActiveXObject("ADODB.Stream");


function printHelp(){
    WScript.Echo(scriptName + " - downloads a file through HTTP");
    WScript.Echo(scriptName + " url localfile [-force yse|no] [-user username -password password] [-proxy proxyserver:port -bypass bypass_list]");
    WScript.Echo("                          [-proxyuser proxy_username -proxypassword proxy_password] [-certificate certificateString]");
    WScript.Echo("-force  - decide to not or to overwrite if the local exists");
    WScript.Echo("proxyserver:port - the proxy server");
    WScript.Echo("bypass- bypass list can be "" if you don't need it");
    WScript.Echo("proxy_user , proxy_password - credentials for proxy server");
    WScript.Echo("user , password - credentials for the server");
    WScript.Echo("certificate - location of SSL certificate");
    WScript.Echo("Example:");
    WScript.Echo(scriptName +" http://somelink.com/somefile.zip c:\somefile.zip -certificate "LOCAL_MACHINE\Personal\My Middle-Tier Certificate"");    
}

function parseArgs(){
    //
    if (ARGS.Length < 3) {
        WScript.Echo("insufficient arguments");
        printHelp();
        WScript.Quit(43);
    }
    url=ARGS.Item(1);
    saveTo=ARGS.Item(2);

    if(ARGS.Length % 2 != 1) {
        WScript.Echo("illegal arguments");
        printHelp();
        WScript.Quit(44);
    }

    for (var i=3;i<ARGS.Length-1;i=i+2){
        if(ARGS.Item(i).toLowerCase=="-force" && ARGS.Item(i+1)=='no'){
            force=false;
        }

        if(ARGS.Item(i).toLowerCase=="-user"){
            user=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-password"){
            pass=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-proxy"){
            proxy=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-bypass"){
            bypass=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-proxyuser"){
            proxy_user=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-proxypassword"){
            proxy_pass=ARGS.Item(i+1);
        }

        if(ARGS.Item(i).toLowerCase=="-certificate"){
            certificate=ARGS.Item(i+1);
        }
    }
}

function existsItem(path){
    return FileSystemObj.FolderExists(path)||FileSystemObj.FileExists(path);
}

stripTrailingSlash = function(path){
    while (path.substr(path.length - 1,path.length) == '\') {
        path=path.substr(0, path.length - 1);
    }
    return path;
}

function deleteItem(path){
    if (FileSystemObj.FileExists(path)){
        FileSystemObj.DeleteFile(path);
        return true;
    } else if (FileSystemObj.FolderExists(path) ) {
        FileSystemObj.DeleteFolder(stripTrailingSlash(path));
        return true;
    } else {
        return false;
    }
}

function writeFile(fileName,data ){
    AdoDBObj.Type = 1;       
    AdoDBObj.Open();
    AdoDBObj.Position=0;
    AdoDBObj.Write(data);
    AdoDBObj.SaveToFile(fileName,2);
    AdoDBObj.Close();   
}

function download( url,file){
    if (force && existsItem(file)){
        if(!deleteItem(file)){
            WScript.Echo("Unable to delete "+ file);
            WScript.Quit(8);
        }
    }else if (existsItem(file)){
        WScript.Echo("Item " + file + " already exist");
        WScript.Quit(9);
    }



    if (proxy!=0 && bypass !="") {
        //https://msdn.microsoft.com/en-us/library/ms760236(v=vs.85).aspx
        XMLHTTPObj.setProxy(SXH_PROXY_SET_DIRECT,proxy,bypass);
    } else if (proxy!=0) {
        XMLHTTPObj.setProxy(SXH_PROXY_SET_DIRECT,proxy,"");
    }



    if (proxy_user!=0 && proxy_pass!=0 ) {
        //https://msdn.microsoft.com/en-us/library/ms763680(v=vs.85).aspx
        XMLHTTPObj.setProxyCredentials(proxy_user,proxy_pass);
    }

    if(certificate!=0) {
        //https://msdn.microsoft.com/en-us/library/ms763811(v=vs.85).aspx
        WinHTTPObj.setOption(3,certificate);
    }

    if (user!=0 && pass!=0){
        //https://msdn.microsoft.com/en-us/library/ms757849(v=vs.85).aspx
         XMLHTTPObj.Open('GET',url,false,user,pass);
    } else {
        XMLHTTPObj.Open('GET',url,false);
    }



    XMLHTTPObj.Send();
    var status=XMLHTTPObj.Status

    switch(status){
        case 200:
            WScript.Echo("Status: 200 OK");
            break;
        case 401:
            WScript.Echo("Status: 401 Unauthorized");
            WScript.Echo("Check if correct user and password were provided");
            WScript.Quit(401);
            break;
        case 407:
            Wscript.Echo("Status:407 Proxy Authentication Required");
            Wscript.Echo("Check if correct proxy user and password were provided");
            WScript.Quit(407);
            break;
        default:
            Wscript.Echo("Status: "+status);
            WScript.Echo("Try to help yourself -> https://en.wikipedia.org/wiki/List_of_HTTP_status_codes");
            WScript.Quit(status);
    }
    writeFile(file,XMLHTTPObj.ResponseBody);
}

function main(){
    parseArgs();
    download(url,saveTo);
}
main();

4 .NET and webclient (Here's no SSL option.Will try to add it. Poxy options have never been tested)

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%Microsoft.NETFramework*jsc.exe"') do (
   set "jsc=%%v"
)

::if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
::)

 %~n0.exe %*

endlocal & exit /b %errorlevel%


*/

//todo SSL Support
//todo Better help message
//todo check if local file exists


import System;
import System.Net.WebClient;
import System.Net.NetworkCredential;
import System.Net.WebProxy;
import System.Uri;
import System.Security.Cryptography.X509Certificates;

var arguments:String[] = Environment.GetCommandLineArgs();

var url=0;
var toFile=0;
var force=true;

var user=0;
var password=0;

var proxy=0;
var bypass=0;
var proxy_user=0;
var proxy_pass=0;

var certificate=0;

function printHelp(){
    Console.WriteLine(arguments[0] + "download from url to a file");
    Console.WriteLine(arguments[0] + "<url> <file> [-user user -password password] [-proxy proxy] [-proxy_user proxy.user -proxy_pass proxy.pass]");

}

function parseArgs(){

    if (arguments.length < 3) {
        Console.WriteLine("Wrong arguments");
        printHelp();
        Environment.Exit(1);
    }

    if (arguments.length %2 != 1) {
        Console.WriteLine("Wrong number arguments");
        printHelp();
        Environment.Exit(2);    
    }

    url=arguments[1];
    toFile=arguments[2];

    for (var i=3;i<arguments.length-1;i=i+2){
        var arg=arguments[i].ToLower();
        switch (arg){
            case  "-user" :
                user=arguments[i+1];
                break;
            case "-password" :
                password=arguments[i+1];
                break;
            case "-proxy" :
                proxy=arguments[i+1];
                break;
            case "-proxy_user" :
                proxy_user=arguments[i+1];
                break;
            case "-proxy_pass" :
                proxy_pass=arguments[i+1];
                break;
            case "-bypass" :
                bypass=[arguments[i+1]];
                break;
            /*case "-certificate" :
                certificate=arguments[i+1];
                break;*/
            default:
                Console.WriteLine("Invalid argument "+ arguments[i]);
                printHelp();
                Environment.Exit(3);
        }
    }

}

function download(){
    var client:System.Net.WebClient = new System.Net.WebClient();

    if (user!=0 && password!=0){
        client.Credentials=new System.Net.NetworkCredential("john", "password1234!");
    }

    if (proxy!=0){
        var webproxy =new System.Net.WebProxy();
        webproxy.Address=new Uri(proxy);
        if (proxy_user!=0 && proxy_pass!=0){
            webproxy.Credentials=new System.Net.NetworkCredential(proxy_user,proxy_pass);
        }
        webproxy.UseDefaultCredentials =false;

        if (bypass!=0){
            webproxy.BypassList=bypass;
            webproxy.BypassProxyOnLocal = false;
        }
        client.Proxy=webproxy;
    }

    try {
        client.DownloadFile(arguments[1], arguments[2]);
    } catch (e) {
        Console.BackgroundColor = ConsoleColor.Green;
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("nnProblem with downloading " + arguments[1] + " to " + arguments[2] + "Check if the internet address is valid");
        Console.ResetColor();
        Environment.Exit(5);
    }
}

 parseArgs();
 download();