从 URL 下载 Windows 批处理文件

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

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

批处理文件似乎不喜欢 http 后面的“/”。有没有什么方法可以转义这些字符,这样它就不会假设它们是函数参数?

552204 次浏览

不能在 http 上使用 xcopy。尝试下载用于 windows 的 wget。也许有用。它是一个命令行实用程序,用于通过 http 非交互式下载文件。你可以在 http://gnuwin32.sourceforge.net/packages/wget.htm买到

据我所知,没有命令行命令可以从 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

使用 ftp:

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

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

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

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

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

然后,您的批处理脚本可以调用下载文件的 JScript 或 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

或者双击它在窗口中进行测试

  1. 从这里下载 Wget

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

  5. Run the file and profit!

您可以使用 wget 设置一个计划任务,在计划任务中使用“ Run”字段,如下所示:

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

这可能有点偏离主题,但是您可以很容易地使用 强力外壳下载文件。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)

我发现了这个 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

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

更多解释 给你

有一个标准的 Windows 组件可以实现你想要做的事情: 比茨。自从 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

从一个批处理文件中,它们被称为:

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上)

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

请参阅下面的链接,其中将解释有关 Aria2的更多信息:

Https://aria2.github.io/

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

另存为 名字,蝙蝠姓名 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

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

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

使用 < a href = “ http://www.f2ko.de/en/b2e.php”rel = “ nofollow”> Bat To Exe Converter

创建一个批处理文件,并将下面的代码放入其中 < br >

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

这个问题在 给你中有很好的答案。我的代码完全是基于这个答案,并做了一些修改。

将下面的代码段保存为 Wget.bat,并将其放在系统路径中(例如,将其放在一个目录中并将该目录添加到系统路径中)

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

wget url/to/file [?custom_name]

url_to_file是强制性的,而 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

此代码要求您安装 PowerShell。

以纯批处理方式下载文件..。 没有任何 jScript,vbScript,Powershell 等等只有纯批处理!

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

这里有一个简单的方法,似乎可以很好地下载批处理脚本中的文件。它应该可以处理几乎所有文件的 URL。如果需要,甚至可以使用代理服务器。

对于下载文件,我们可以从 Windows 系统使用 BITSADMIN.EXE。不需要下载/安装任何东西或使用任何 JScript 或 VBScript 等。大多数 Windows 版本都有 Bitsadmin.exe,可能从 XP 到 Windows10都有。

好好享受吧!


用法:

您可以直接使用 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 的信息,请单击此 链接


故障排除:
如果您得到这个错误: “无法连接到 BITS-0x80070422”
确保 Windows 服务“后台智能传输服务(BITS)”已启用,然后重试。(默认情况下应该启用。)


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

我制作了这3个函数来简化 bitsadmin 命令。更容易使用和记忆。如果在脚本中多次使用它,那么它可能特别有用。

请注意..。
在使用这些函数之前,首先需要将它们从 CUSTOM _ 函数中复制出来。CMD 到你的脚本末尾。还有一个完整的例子: 下载-示例。CMD

: 下载 _ 文件“ URL”
主要功能,将从 URL 下载文件。

: DOWLOAD _ 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


自定义函数

: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

下载示例 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

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

CURL

在 windows 10的 build 17063中添加了 CURL 实用程序:

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

小事一桩

在宏中使用 bitsadmin 会更容易:

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

Winhttp 对象

对于向下兼容,你可以使用 Winhttpjs.bat(这样你也可以执行 POST,DELETE 和其他 http 方法) :

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