从URL下载Windows批处理文件

133

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

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

批处理文件似乎不喜欢 http 后面的“/”字符。 有没有一些方法可以转义这些字符,以便它不会将其视为函数参数?


我尝试总结了在Windows中如何使用本地工具而不使用第三方软件下载文件的方法。 - npocmaka
2
我知道这是一个老帖子了,但对于那些从现在开始到达这里的人来说......Windows 10已经具备了本地CURL。对于这种情况,最简单的命令应该像这样:curl "http://www.example.com/package.zip" --output package.zip - MMJ
20个回答

156

使用 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 上安装)


3
太棒了!比bitsadmin.exe更好,因为它没有被弃用。 - sinelaw
4
2.0命令在3.0版本中也可用。另外,我注意到对于非绝对目标路径,该文件将相对于用户的主文件夹保存。 - Cwt
1
这太棒了。我已经寻找这个很久了。谢谢!在2017年仍然有效。 - Albert MN.
不起作用,它显示“.DownloadFile在此时是意外的。” - Jay Shenawy
2
2.0版本的代码在我的最新Win7上运行良好。由于它无需给予PowerShell管理员权限即可正常工作,这就成为了一个完美的概念证明:点击未知的.bat.ps1文件确实会捣乱你的东西。 - user1934286
显示剩余9条评论

110

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

运行:

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

工作名称只是下载任务的显示名称-将其设置为描述您正在执行的内容的内容。

15
不错的工具!但我的Win8系统显示:“BITSAdmin已被弃用,未来的Windows版本不保证可用。 BITS服务的管理工具现在由BITS PowerShell cmdlets提供。” - Peteter
1
正如我先前提到的那样,由任务计划程序自动运行的批处理中,bitsadmin无法工作。:( - TomeeNS
1
@cmroanirgo bitsadmin 在 Windows XP Home Edition 中不可用。 - cascading-style
1
仍然在Windows 10 Pro中保持强劲。 - Orwellophile
3
谢谢!真是太好了,在一台被感染的电脑上,没有其他可能的下载网络文件的方法。(甚至无法启动 Powershell) - szab.kel
显示剩余6条评论

29

这可能与主题有些偏离,但你可以使用 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)

2
如果你搜索该博客,会发现其他PowerShell示例,这些示例在新的PowerShell 3.0版本中更容易实现。 - juFo
我认为在 System.Net.WebClient 中不需要使用 System - user1934286

25

据我所知,Microsoft命令行中没有连接到URL的命令。在Windows中尝试使用wget:
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


3
不需要使用wget或任何第三方集成工具。通过MS命令行中的bitsadmin实用程序,BITS(自Windows XP以来的标准Windows组件)可以完成此操作。回答已发布 - 尽管有点晚(落后了2年?) - brainwood

25

使用纯批处理下载文件... 没有任何JScript、VBScript、Powershell等... 只有纯批处理!

有些人说,使用批处理脚本下载文件而不使用任何JScript或VBScript等是不可能的... 但他们绝对错了!

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

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

尽情享受吧!


用法:

您可以直接使用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

我为简化bitsadmin命令而创建了这三个函数。使用和记忆起来都更容易。如果您在脚本中多次使用它们,它们尤其有用。

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

:DOWNLOAD_FILE "URL"
主要功能,从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

DOWNLOAD-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

2
我刚刚更新了我的回答... 显然,下载速度非常慢,所以我将参数从“/priority normal”更改为“/priority foreground”,并解决了问题。现在应该使用您可用的100%带宽。(而不是约5%) - Frank Einstein

11
' 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 上双击它以进行测试


2
这只是下载到内存中,还没有写入文件。如果需要下载到文件中,请参考此答案:https://dev59.com/FHA85IYBdhLWcg3wCe9Z#2973344 - Daniel

6
据我所知,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

More explanation here


有没有任何理由不在单独的文件中完成这个任务,然后从批处理文件中调用VBScript文件?如果你需要编辑它,这样做会变得非常混乱。 - seadoggie01

6

CURL

在Windows 10的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" 

有没有办法在批处理文件中将结果保存为变量? - trex005
@trex005 - 你可以读取生成的文件并将结果保存为变量。 - npocmaka

4
  1. Download Wget from here http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. Then install it.

  3. Then make some .bat file and put this into it

    @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. Adjust the URL and the file path in the script

  5. Run the file and profit!

3
如果Bitsadmin不是您的菜,您可以使用此PowerShell命令:
Start-BitsTransfer -Source http://www.foo.com/package.zip -Destination C:\somedir\package.zip

我想下载 .exe 文件,但是我尝试了这段代码却没有成功。我能否使用批处理脚本来下载 .exe 文件? - MAS. John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接