【问题标题】:Windows batch file file download from a URL从 URL 下载 Windows 批处理文件文件
【发布时间】:2011-06-04 21:09:17
【问题描述】:

我正在尝试使用 Windows 批处理文件从网站(例如 http://www.example.com/package.zip)下载文件。我在编写以下函数时收到错误代码:

xcopy /E /Y "http://www.example.com/package.zip"

批处理文件似乎不喜欢 http 后面的“/”。是否有任何方法可以转义这些字符,使其不假定它们是函数参数?

【问题讨论】:

  • 这里:stackoverflow.com/questions/28143160/… 我尝试恢复在 Windows 中仅使用本机工具而不使用第三方软件下载文件的方式。
  • 我知道这是一篇旧文章,但对于那些从现在开始到这里的人来说...... Windows 10 已经有了原生 CURL。这种情况下最简单的命令是这样的: curl "example.com/package.zip" --output package.zip

标签: windows batch-file download scripting


【解决方案1】:

卷曲

在 Windows 10 的 build 17063 中添加了 CURL 实用程序。要下载文件,您可以使用:

curl "https://download.sysinternals.com/files/PSTools.zip" --output pstools.zip

BITSADMIN

将 bitsadmin 与宏一起使用会更容易:

set "download=bitsadmin /transfer myDownloadJob /download /priority normal"
%download% "https://download.sysinternals.com/files/PSTools.zip" %cd%\pstools.zip

Winhttp com 对象

为了向后兼容,您可以使用winhttpjs.bat(您还可以执行 POST、DELETE 和其他 http 方法):

call winhhtpjs.bat "https://example.com/files/some.zip" -saveTo "c:\somezip.zip" 

【讨论】:

    【解决方案2】:

    正在以 PURE BATCH 格式下载文件... 没有任何 JScript、VBScript、Powershell 等...只有纯 Batch!

    有些人说不使用任何 JScript 或 VBScript 等就无法使用批处理脚本下载文件……但他们肯定错了!

    这是一个简单的方法,似乎非常适合在批处理脚本中下载文件。它应该适用于几乎任何文件的 URL。如果需要,甚至可以使用代理服务器。

    下载文件,我们可以使用Windows系统的BITSADMIN.EXE。无需下载/安装任何东西或使用任何 JScript 或 VBScript 等。Bitsadmin.exe 存在于大多数 Windows 版本中,可能从 XP 到 Windows 10。

    享受吧!


    用法:

    您可以直接使用 BITSADMIN 命令,如下所示:
    bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "http://example.com/File.zip" "C:\Downloads\File.zip"

    代理服务器:
    如需使用代理连接,请在下载前使用此命令。
    bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080"

    如果您想了解有关 BITSadmin.exe 的更多信息,请单击此LINK


    疑难解答:
    如果您收到此错误:“无法连接到 BITS - 0x80070422”
    确保启用了 Windows 服务“后台智能传输服务 (BITS)”,然后重试。 (它应该默认启用。)


    自定义功能
    Call :DOWNLOAD_FILE "URL"
    Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
    Call :DOWNLOAD_PROXY_OFF

    我创建了这 3 个函数来简化 bitsadmin 命令。它更易于使用和记忆。如果您在脚本中多次使用它,它会特别有用。

    请注意...
    在使用这些函数之前,您首先需要将它们从 CUSTOM_FUNCTIONS.CMD 复制到脚本的末尾。还有一个完整的例子:DOWNLOAD-EXAMPLE.CMD

    :DOWNLOAD_FILE "网址"
    主函数,将从 URL 下载文件。

    :DOWNLOAD_PROXY_ON "SERVER:PORT"
    (可选)如果您需要使用代理服务器,可以使用此功能。
    调用 :DOWNLOAD_PROXY_OFF 函数将禁用代理服务器。

    示例:
    CALL :DOWNLOAD_PROXY_ON "proxy-server.com:8080"
    CALL :DOWNLOAD_FILE "http://example.com/File.zip" "C:\Downloads\File.zip"
    CALL :DOWNLOAD_PROXY_OFF


    CUSTOM_FUNCTIONS.CMD

    :DOWNLOAD_FILE
        rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
        bitsadmin /transfer mydownloadjob /download /priority FOREGROUND %1 %2
    GOTO :EOF
    
    :DOWNLOAD_PROXY_ON
        rem FUNCTION FOR USING A PROXY SERVER:
        bitsadmin /setproxysettings mydownloadjob OVERRIDE %1
    GOTO :EOF
    
    :DOWNLOAD_PROXY_OFF
        rem FUNCTION FOR STOP USING A PROXY SERVER:
        bitsadmin /setproxysettings mydownloadjob NO_PROXY
    GOTO :EOF
    

    下载-EXAMPLE.CMD

    @ECHO OFF
    SETLOCAL
    
    rem FOR DOWNLOADING FILES, THIS SCRIPT IS USING THE "BITSADMIN.EXE" SYSTEM FILE.
    rem IT IS PRESENT ON MOST WINDOWS VERSION, PROBABLY FROM WINDOWS XP TO WINDOWS 10.
    
    
    :SETUP
    
    rem URL (5MB TEST FILE):
    SET "FILE_URL=http://ipv4.download.thinkbroadband.com/5MB.zip"
    
    rem SAVE IN CUSTOM LOCATION:
    rem SET "SAVING_TO=C:\Folder\5MB.zip"
    
    rem SAVE IN THE CURRENT DIRECTORY
    SET "SAVING_TO=5MB.zip"
    SET "SAVING_TO=%~dp0%SAVING_TO%"
    
    :MAIN
    
    ECHO.
    ECHO DOWNLOAD SCRIPT EXAMPLE
    ECHO.
    ECHO FILE URL: "%FILE_URL%"
    ECHO SAVING TO:  "%SAVING_TO%"
    ECHO.
    
    rem UNCOMENT AND MODIFY THE NEXT LINE IF YOU NEED TO USE A PROXY SERVER:
    rem CALL :DOWNLOAD_PROXY_ON "PROXY-SERVER.COM:8080"
     
    rem THE MAIN DOWNLOAD COMMAND:
    CALL :DOWNLOAD_FILE "%FILE_URL%" "%SAVING_TO%"
    
    rem UNCOMMENT NEXT LINE FOR DISABLING THE PROXY (IF YOU USED IT):
    rem CALL :DOWNLOAD_PROXY_OFF
    
    :RESULT
    ECHO.
    IF EXIST "%SAVING_TO%" ECHO YOUR FILE HAS BEEN SUCCESSFULLY DOWNLOADED.
    IF NOT EXIST "%SAVING_TO%" ECHO ERROR, YOUR FILE COULDN'T BE DOWNLOADED.
    ECHO.
    
    :EXIT_SCRIPT
    PAUSE
    EXIT /B
    
    
    
    
    rem FUNCTIONS SECTION
    
    
    :DOWNLOAD_FILE
        rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
        bitsadmin /transfer mydownloadjob /download /priority FOREGROUND %1 %2
    GOTO :EOF
    
    :DOWNLOAD_PROXY_ON
        rem FUNCTION FOR USING A PROXY SERVER:
        bitsadmin /setproxysettings mydownloadjob OVERRIDE %1
    GOTO :EOF
    
    :DOWNLOAD_PROXY_OFF
        rem FUNCTION FOR STOP USING A PROXY SERVER:
        bitsadmin /setproxysettings mydownloadjob NO_PROXY
    GOTO :EOF
    

    【讨论】:

    • 我刚刚更新了我的答案......显然,下载速度非常慢,所以我将参数从“/priority normal”更改为“/priority foreground”并解决了问题。它现在应该使用 100% 的可用带宽。 (而不是 ~ 5%)
    【解决方案3】:

    在 Windows 上有一个实用程序(与 CMD 一起存在),可以从 CMD 运行(如果您有写入权限):

    set url=https://www.nsa.org/content/hl-images/2017/02/09/NSA.jpg
    set file=file.jpg
    certutil -urlcache -split -f %url% %file%
    echo Done.
    

    内置于 Windows 应用程序中。无需外部下载。

    在 Win 10 上测试

    【讨论】:

      【解决方案4】:

      使用 PowerShell 2.0(预装 Windows 7),您可以使用:

      (New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')
      

      从 PowerShell 3.0(预装 Windows 8)开始,您可以使用 Invoke-WebRequest

      Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip
      

      从批处理文件中调用它们:

      powershell -Command "(New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')"
      powershell -Command "Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip"
      

      (PowerShell 2.0 可用于在 XP 上安装,3.0 可用于 Windows 7)

      【讨论】:

      • 酷!比 bitsadmin.exe 更好,因为它没有被弃用。
      • @sevenforce,Powershell 2.0 命令是否也适用于 Powershell 3.0,或者您是否使用该 Powershell 3.0 语法?
      • @RichSignell:2.0 命令也适用于 3.0。对于我顺便注意到的 2.0 命令,对于非绝对目标路径,文件将相对于用户的主文件夹保存。
      • 这太棒了。我找这个已经很久了。谢谢! 2017 年仍然有效。
      • 2.0 代码在最新的 Win 7 上为我工作。因为它也可以在不授予 PowerShell 管理员权限的情况下工作,所以让它成为一个完美的概念证明,点击未知 @987654326 @ 和 .ps1 文件真的会搞砸你的东西。
      【解决方案5】:

      最后我检查了一下,没有命令行命令可以从 MS 命令行连接到 URL。试试 wget for Windows:
      http://gnuwin32.sourceforge.net/packages/wget.htm

      或 URL2File:
      http://www.chami.com/free/url2file_wincon.html

      在 Linux 中,您可以使用“wget”。

      或者,您可以尝试使用 VBScript。它们类似于命令行程序,但它们是由 wscript.exe 脚本主机解释的脚本。以下是使用 VBS 下载文件的示例:
      https://serverfault.com/questions/29707/download-file-from-vbscript

      【讨论】:

      • 您不需要 wget 或任何第 3 方集成。 BITS(自 XP 以来的标准 Windows 组件)可以使用 MS 命令行中的 bitsadmin 实用程序来完成。已发布答案 - 尽管有点晚(落后 2 年?)
      【解决方案6】:

      您可以使用 wget 设置计划任务,将计划任务中的“运行”字段用作:

      C:\wget\wget.exe -q -O nul "http://www.google.com/shedule.me"
      

      【讨论】:

        【解决方案7】:

        您也可以使用 aria2 从特定 URL 下载文件,而不是 wget。

        请参阅以下链接,了解有关 aria2 的更多信息:

        https://aria2.github.io/

        【讨论】:

        • +1 提到了这个我还不知道的工具。太糟糕了,它像 wget 一样遇到了 HTTPS 问题(还没有找到设置 CA 链的方法)
        【解决方案8】:

        这个问题在here 有很好的答案。我的代码完全基于该答案并进行了一些修改。

        在sn-p下面另存为wget.bat并放在你的系统路径中(例如,把它放在一个目录中,然后将此目录添加到系统路径中。)

        您可以在 cli 中使用它,如下所示:

        wget url/to/file [?custom_name]

        url_to_file 是必填项,custom_name 是可选项

        1. 如果未提供名称,则下载的文件将在 url 中以自己的名称保存。
        2. 如果提供了名称,则文件将以新名称保存。

        文件 url 和保存的文件名以 ansi 彩色文本显示。如果这给您带来了问题,请查看this github 项目。

        @echo OFF
        setLocal EnableDelayedExpansion
        set Url=%1
        set Url=!Url:http://=!
        set Url=!Url:/=,!
        set Url=!Url:%%20=?!
        set Url=!Url: =?!
        
        call :LOOP !Url!
        
        set FileName=%2
        if "%2"=="" set FileName=!FN!
        
        echo.
        echo.Downloading: [1;33m%1[0m to [1;33m\!FileName![0m
        
        powershell.exe -Command wget %1 -OutFile !FileName!
        
        goto :EOF
        :LOOP
        if "%1"=="" goto :EOF
        set FN=%1
        set FN=!FN:?= !
        shift
        goto :LOOP
        

        附注此代码要求您安装 PowerShell。

        【讨论】:

          【解决方案9】:

          使用Bat To Exe Converter

          创建一个批处理文件并将类似于以下代码的内容放入其中

          %extd% /download http://www.examplesite.com/file.zip file.zip
          

          %extd% /download http://stackoverflow.com/questions/4619088/windows-batch-file-file-download-from-a-url thistopic.html
          

          并将其转换为 exe。

          【讨论】:

            【解决方案10】:

            如果你不喜欢 bitsadmin,你可以使用这个 PowerShell 命令:

            Start-BitsTransfer -Source http://www.foo.com/package.zip -Destination C:\somedir\package.zip
            

            【讨论】:

            • 我想下载 .exe,我也使用了这段代码,但没有用。我可以使用批处理脚本下载 .exe 吗?
            【解决方案11】:

            这应该工作我为游戏服务器项目做了以下。它将下载 zip 并将其解压缩到您指定的任何目录。

            另存为 name.batname.cmd

            @echo off
            set downloadurl=http://media.steampowered.com/installer/steamcmd.zip
            set downloadpath=C:\steamcmd\steamcmd.zip
            set directory=C:\steamcmd\
            %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe -Command "& {Import-Module BitsTransfer;Start-BitsTransfer '%downloadurl%' '%downloadpath%';$shell = new-object -com shell.application;$zip = $shell.NameSpace('%downloadpath%');foreach($item in $zip.items()){$shell.Namespace('%directory%').copyhere($item);};remove-item '%downloadpath%';}"
            echo download complete and extracted to the directory.
            pause
            

            原文:https://github.com/C0nw0nk/SteamCMD-AutoUpdate-Any-Gameserver/blob/master/steam.cmd

            【讨论】:

            • 我想下载 .exe,但我使用了此代码但无法正常工作。我可以使用批处理脚本下载 .exe 吗?
            【解决方案12】:

            有一个标准的 Windows 组件可以实现您想要做的事情:BITS。它自 XP 和 2000 SP3 起就包含在 Windows 中。

            运行:

            bitsadmin.exe /transfer "JobName" http://download.url/here.exe C:\destination\here.exe
            

            作业名称只是下载作业的显示名称 - 将其设置为描述您正在执行的操作的名称。

            【讨论】:

            • 不错的工具!但我的 win8 显示:“BITSAdmin 已弃用,不保证在未来的 Windows 版本中可用。BITS 服务的管理工具现在由 BITS PowerShell cmdlet 提供。”
            • 正如我已经提到的,bitsadmin 不能在从任务调度程序运行的自动批处理中工作:(
            • @cmroanirgo bitsadmin 在 Windows XP 家庭版中不可用。
            • 在 Windows 10 专业版中仍然很强大
            • 谢谢!在受感染的计算机上像魅力一样工作,没有其他可能的方式从网络下载文件。 (即使是 powershell 也无法启动)
            【解决方案13】:

            AFAIK,Windows 没有用于下载文件的内置命令行工具。但是您可以从 VBScript 中执行此操作,并且可以使用 echo 和输出重定向从批处理生成 VBScript 文件:

            @echo off
            
            rem Windows has no built-in wget or curl, so generate a VBS script to do it:
            rem -------------------------------------------------------------------------
            set DLOAD_SCRIPT=download.vbs
            echo Option Explicit                                                    >  %DLOAD_SCRIPT%
            echo Dim args, http, fileSystem, adoStream, url, target, status         >> %DLOAD_SCRIPT%
            echo.                                                                   >> %DLOAD_SCRIPT%
            echo Set args = Wscript.Arguments                                       >> %DLOAD_SCRIPT%
            echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1")              >> %DLOAD_SCRIPT%
            echo url = args(0)                                                      >> %DLOAD_SCRIPT%
            echo target = args(1)                                                   >> %DLOAD_SCRIPT%
            echo WScript.Echo "Getting '" ^& target ^& "' from '" ^& url ^& "'..."  >> %DLOAD_SCRIPT%
            echo.                                                                   >> %DLOAD_SCRIPT%
            echo http.Open "GET", url, False                                        >> %DLOAD_SCRIPT%
            echo http.Send                                                          >> %DLOAD_SCRIPT%
            echo status = http.Status                                               >> %DLOAD_SCRIPT%
            echo.                                                                   >> %DLOAD_SCRIPT%
            echo If status ^<^> 200 Then                                            >> %DLOAD_SCRIPT%
            echo    WScript.Echo "FAILED to download: HTTP Status " ^& status       >> %DLOAD_SCRIPT%
            echo    WScript.Quit 1                                                  >> %DLOAD_SCRIPT%
            echo End If                                                             >> %DLOAD_SCRIPT%
            echo.                                                                   >> %DLOAD_SCRIPT%
            echo Set adoStream = CreateObject("ADODB.Stream")                       >> %DLOAD_SCRIPT%
            echo adoStream.Open                                                     >> %DLOAD_SCRIPT%
            echo adoStream.Type = 1                                                 >> %DLOAD_SCRIPT%
            echo adoStream.Write http.ResponseBody                                  >> %DLOAD_SCRIPT%
            echo adoStream.Position = 0                                             >> %DLOAD_SCRIPT%
            echo.                                                                   >> %DLOAD_SCRIPT%
            echo Set fileSystem = CreateObject("Scripting.FileSystemObject")        >> %DLOAD_SCRIPT%
            echo If fileSystem.FileExists(target) Then fileSystem.DeleteFile target >> %DLOAD_SCRIPT%
            echo adoStream.SaveToFile target                                        >> %DLOAD_SCRIPT%
            echo adoStream.Close                                                    >> %DLOAD_SCRIPT%
            echo.                                                                   >> %DLOAD_SCRIPT%
            rem -------------------------------------------------------------------------
            
            cscript //Nologo %DLOAD_SCRIPT% http://example.com targetPathAndFile.html
            

            更多解释here

            【讨论】:

            • 有什么理由不在单独的文件中执行此操作,而只是从批处理中调用 VBScript 文件?如果您需要对其进行编辑,这将是一团糟。
            【解决方案14】:

            我找到了这个 VB 脚本:

            http://www.olafrv.com/?p=385

            像魅力一样工作。通过非常简单的函数调用配置为函数:

            SaveWebBinary "http://server/file1.ext1", "C:/file2.ext2"
            

            原文来自:http://www.ericphelps.com/scripting/samples/BinaryDownload/index.htm

            这里是冗余的完整代码:

            Function SaveWebBinary(strUrl, strFile) 'As Boolean
            Const adTypeBinary = 1
            Const adSaveCreateOverWrite = 2
            Const ForWriting = 2
            Dim web, varByteArray, strData, strBuffer, lngCounter, ado
                On Error Resume Next
                'Download the file with any available object
                Err.Clear
                Set web = Nothing
                Set web = CreateObject("WinHttp.WinHttpRequest.5.1")
                If web Is Nothing Then Set web = CreateObject("WinHttp.WinHttpRequest")
                If web Is Nothing Then Set web = CreateObject("MSXML2.ServerXMLHTTP")
                If web Is Nothing Then Set web = CreateObject("Microsoft.XMLHTTP")
                web.Open "GET", strURL, False
                web.Send
                If Err.Number <> 0 Then
                    SaveWebBinary = False
                    Set web = Nothing
                    Exit Function
                End If
                If web.Status <> "200" Then
                    SaveWebBinary = False
                    Set web = Nothing
                    Exit Function
                End If
                varByteArray = web.ResponseBody
                Set web = Nothing
                'Now save the file with any available method
                On Error Resume Next
                Set ado = Nothing
                Set ado = CreateObject("ADODB.Stream")
                If ado Is Nothing Then
                    Set fs = CreateObject("Scripting.FileSystemObject")
                    Set ts = fs.OpenTextFile(strFile, ForWriting, True)
                    strData = ""
                    strBuffer = ""
                    For lngCounter = 0 to UBound(varByteArray)
                        ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
                    Next
                    ts.Close
                Else
                    ado.Type = adTypeBinary
                    ado.Open
                    ado.Write varByteArray
                    ado.SaveToFile strFile, adSaveCreateOverWrite
                    ado.Close
                End If
                SaveWebBinary = True
            End Function
            

            【讨论】:

              【解决方案15】:

              这可能有点离题,但您可以使用 Powershell 轻松下载文件。 Powershell 带有现代版本的 Windows,因此您无需在计算机上安装任何额外的东西。我通过阅读此页面了解了如何做到这一点:

              http://teusje.wordpress.com/2011/02/19/download-file-with-powershell/

              代码是:

              $webclient = New-Object System.Net.WebClient
              $url = "http://www.example.com/file.txt"
              $file = "$pwd\file.txt"
              $webclient.DownloadFile($url,$file)
              

              【讨论】:

              • 如果您搜索该博客,还有其他 powershell 示例可以让您更轻松地使用新的 PowerShell 3.0 版
              • 我认为你不需要 System in System.Net.WebClient
              【解决方案16】:
              1. 从这里下载 Wget http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

              2. 然后安装。

              3. 然后制作一些.bat文件并将其放入其中

                @echo off
                
                for /F "tokens=2,3,4 delims=/ " %%i in ('date/t') do set y=%%k
                for /F "tokens=2,3,4 delims=/ " %%i in ('date/t') do set d=%%k%%i%%j
                for /F "tokens=5-8 delims=:. " %%i in ('echo.^| time ^| find "current" ') do set t=%%i%%j
                set t=%t%_
                if "%t:~3,1%"=="_" set t=0%t%
                set t=%t:~0,4%
                set "theFilename=%d%%t%"
                echo %theFilename%
                
                
                cd "C:\Program Files\GnuWin32\bin"
                wget.exe --output-document C:\backup\file_%theFilename%.zip http://someurl/file.zip
                
              4. 调整脚本中的URL和文件路径

              5. 运行文件并获利!

              【讨论】:

                【解决方案17】:
                ' Create an HTTP object
                myURL = "http://www.google.com"
                Set objHTTP = CreateObject( "WinHttp.WinHttpRequest.5.1" )
                
                ' Download the specified URL
                objHTTP.Open "GET", myURL, False
                objHTTP.Send
                intStatus = objHTTP.Status
                
                If intStatus = 200 Then
                  WScript.Echo " " & intStatus & " A OK " +myURL
                Else
                  WScript.Echo "OOPS" +myURL
                End If
                

                然后

                C:\>cscript geturl.vbs
                Microsoft (R) Windows Script Host Version 5.7
                Copyright (C) Microsoft Corporation. All rights reserved.
                
                200 A OK http://www.google.com
                

                或者直接双击它在windows中测试

                【讨论】:

                【解决方案18】:

                使用 ftp:

                (ftp *yourewebsite.com*-a)
                cd *directory*
                get *filename.doc*
                close
                

                更改星号中的所有内容以适应您的情况。

                【讨论】:

                • 肯定依赖托管文件的服务器来支持 FTP。
                • Questin 与 http 相关,而不是 ftp
                【解决方案19】:

                BATCH 可能无法做到这一点,但如果您不想使用 Windows 默认未安装的工具,您可以使用 JScript 或 VBScript。

                本页的第一个示例下载 VBScript 中的二进制文件: http://www.robvanderwoude.com/vbstech_internet_download.php

                此 SO 答案使用 JScript(IMO,更好的语言)下载文件: Windows Script Host (jscript): how do i download a binary file?

                然后,您的批处理脚本可以调用下载文件的 JScript 或 VBScript。

                【讨论】:

                  【解决方案20】:

                  您不能通过 http 使用 xcopy。尝试下载 wget for windows。这可能会奏效。它是一个命令行实用程序,用于通过 http 进行非交互式文件下载。您可以通过http://gnuwin32.sourceforge.net/packages/wget.htm获取它

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-09-01
                    • 1970-01-01
                    • 2012-09-01
                    • 1970-01-01
                    • 2022-08-15
                    • 1970-01-01
                    • 2016-03-16
                    • 2012-12-13
                    相关资源
                    最近更新 更多