Windows批处理文件文件从URL下载


113

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

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

批处理文件在http后面似乎不喜欢“ /”。有什么方法可以转义那些字符,以免不假定它们是函数参数?


在这里:stackoverflow.com/questions/28143160/…我试图恢复仅使用本机工具而不使用第三方软件就可以在Windows中下载文件的方式。
npocmaka 2015年

Answers:


135

使用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"

(可以在Windows 7的XP,3.0上安装PowerShell 2.0)


2
凉!比bitsadmin.exe更好,因为它不被弃用。
sinelaw

@ sevenforce,Powershell 2.0命令是否也可以在Powershell 3.0中使用,还是必须使用该Powershell 3.0语法?
Rich Signell 2015年

4
@RichSignell:2.0命令在3.0中也有效。对于我注意到的2.0命令,对于非绝对目标路径,文件将相对于用户的主文件夹保存。
sevenforce

1
这真太了不起了。我一直在找这个很久了。谢谢!仍在2017
Albert MN。

2
2.0代码对我来说适用于最新的Win7。并且由于它在没有授予PowerShell管理员权限的情况下也可以工作,因此请将此作为一个完美的概念证明,即单击未知文件.bat.ps1文件确实可以使您的工作搞砸。
1934286 '18 -11-29

97

有一个标准的Windows组件可以实现您要执行的操作:BITS。从XP和2000 SP3开始,它已包含在Windows中。

跑:

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

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


14
不错的工具!但是我的win8说:“ BITSAdmin已被弃用,并且不能保证在Windows的将来版本中可用。BITS服务的管理工具现在由BITS PowerShell cmdlet提供。”
彼得

1
正如我已经提到的,bitsadmin在从任务计划程序运行的自动批处理中
不起作用

1
@cmroanirgo bitsadmin在Windows XP Home Edition中不可用。
级联样式

1
在Windows 10 Pro中仍然表现强劲
Orwellophile '17

3
谢谢!在受感染的计算机上无法正常工作,无法通过其他方式从网络下载文件。(甚至无法启动powershell)
szab.kel

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 2013年

我不认为你需要SystemSystem.Net.WebClient
1934286

25

最后我检查了,没有命令行命令可以从MS命令行连接到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


2
您不需要wget或任何第三方集成。BITS(自XP起为标准Windows组件)可以使用MS命令行中的bitsadmin实用程序来执行此操作。答案发布-尽管有些迟(落后2年?)
brainwood 2013年

18

正在下载PURE BATCH中的文件...

没有任何JScript,VBScript,Powershell等...仅纯批处理!

有人说,如果不使用任何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" "<local>"

如果您需要有关BITSadmin.exe的更多信息,请单击此链接。


疑难解答:
如果出现此错误:“无法连接到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”
主要功能,将从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 "<local>"
GOTO :EOF

:DOWNLOAD_PROXY_OFF
    rem FUNCTION FOR STOP USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF

下载示例

@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 "<local>"
GOTO :EOF

:DOWNLOAD_PROXY_OFF
    rem FUNCTION FOR STOP USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF

1
我刚刚更新了答案...显然,下载速度异常缓慢,因此我将参数从“ /优先级正常”更改为“ /优先级前景”,从而解决了该问题。现在,它应该正在使用100%的可用带宽。(而不是5%)
弗兰克·爱因斯坦

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中进行测试


1
这只是下载到内存中,尚未写入文件。检查此答案以下载到文件中:stackoverflow.com/a/2973344/977804
Daniel

5

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

在这里更多的解释


有什么理由不在单独的文件中执行此操作,而只是从批处理中调用VBScript文件?如果您需要对其进行编辑,那将是一团糟。
seadoggie01

4
  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. 运行文件并获利!


3

如果您不是位管理员,则可以使用以下PowerShell命令:

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

我想下载.exe,我也使用此代码,但无法正常工作..我可以使用批处理脚本下载.exe吗?
MAS。约翰

3

使用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。



2

BATCH可能无法执行此操作,但是如果您不想使用Windows默认情况下未安装的工具,则可以使用JScript或VBScript。

此页面上的第一个示例使用VBScript下载二进制文件:http : //www.robvanderwoude.com/vbstech_internet_download.php

这样的答案使用JScript(IMO,更好的语言)下载文件: Windows Script Host(jscript):如何下载二进制文件?

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


2

这应该工作,我为游戏服务器项目做了以下工作。它将下载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吗?
MAS。约翰

1

我找到了这个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

1

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

将以下代码段另存为wget.bat并将其放置在系统路径中(例如,将其放置在目录中并将此目录添加到系统路径中。)

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

wget url/to/file [?custom_name]

在哪里url_to_file是强制性的,custom_name是可选的

  1. 如果未提供名称,则下载的文件将通过URL以其自己的名称保存。
  2. 如果提供了名称,则文件将使用新名称保存。

文件URL和保存的文件名以彩色文本显示。如果这给您造成问题,请检查 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

PS此代码要求您安装PowerShell。


1

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

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

1

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上测试


-3

使用ftp:

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

更改所有星号以适合您的情况。


当然要依赖托管文件的服务器来支持FTP。
PnP

Questin是http相关,而不是FTP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.