Windowsbatch file文件从URL下载

我正尝试使用Windowsbatch file从网站(例如http://www.example.com/package.zip )下载文件。 我在写下面的函数时遇到错误代码:

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

batch file似乎不喜欢http后面的“/”。 有什么方法来逃​​避这些字符,所以它不认为他们是function参数?

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

跑:

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

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

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

从一个batch file他们被称为:

 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上安装,Windows 7为3.0)

这可能是一个小题目,但你可以很容易地使用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) 

最后我检查了一下,命令行命令没有连接到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

 ' 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中testing

AFAIK,Windows没有内置的命令行工具来下载文件。 但是你可以从VBScript中完成,你可以使用echo和输出redirect来批量生成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 

这里更多的解释

  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和文件path

  5. 运行文件和利润!

如果bitsadmin不是你的一杯茶,你可以使用这个PowerShell命令:

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

使用蝙蝠到exe转换器

创build一个batch file,并将类似下面的代码放入它

 %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。

你不能在http上使用xcopy。 尝试下载Windows的wget。 这可能会诀窍。 它是一个通过http非交互式下载文件的命令行工具。 你可以在http://gnuwin32.sourceforge.net/packages/wget.htm获取它;

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

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

这个答案使用JScript(IMO,更好的语言)下载文件: Windows脚本宿主(jscript):我如何下载二进制文件?

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

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

我发现这个VB脚本:

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

奇迹般有效。 configuration为一个非常简单的函数调用的函数:

 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 

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

请参阅下面的链接,这将更详细地解释aria2:

https://aria2.github.io/

这个问题在这里有很好的答案。 我的代码纯粹是基于一些修改的答案。

将下面的代码保存为wget.bat ,并将其放在系统path中(例如,将其放在一个目录中,并将此目录添加到系统path中。)

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

wget url/to/file [?custom_name]

其中custom_name是强制性的, custom_name是可选的

  1. 如果没有提供名称,则下载的文件将通过自己的名称从url保存。
  2. 如果提供名称,则文件将以新名称保存。

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

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

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

使用ftp:

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

改变星号,以适应你的情况。