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

Jam*_*mes 101 windows scripting batch-file download

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

xcopy /E /Y "http://www.example.com/package.zip"
Run Code Online (Sandbox Code Playgroud)

批处理文件似乎不喜欢http之后的"/".有没有办法逃避这些字符,所以它不假设它们是函数参数?

sev*_*rce 118

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

(New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')
Run Code Online (Sandbox Code Playgroud)

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

Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

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

  • @RichSignell:2.0命令也适用于3.0.对于我注意到的2.0命令,对于非绝对目标路径,文件将相对于用户的主文件夹保存. (4认同)
  • 凉!比bitsadmin.exe更好,因为它不被弃用. (2认同)
  • 2.0代码对我来说适用于最新的Win7。并且由于它在没有授予PowerShell管理员权限的情况下也可以工作,因此请将此作为完美的概念证明,即单击未知的`.bat`和`.ps1`文件。真的可以搞砸你的东西。 (2认同)

bra*_*ood 93

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

跑:

bitsadmin.exe /transfer "JobName" http://download.url/here.exe C:\destination\here.exe
Run Code Online (Sandbox Code Playgroud)

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

  • 不错的工具!但我的win8说:"BITSAdmin已被弃用,并不保证在未来的Windows版本中可用.BITS服务的管理工具现在由BITS PowerShell cmdlet提供." (14认同)
  • 谢谢!在受感染的计算机上工作就像一个魅力,没有其他可能的方法从Web下载文件.(即使是powershell也无法启动) (3认同)

Dav*_*son 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)
Run Code Online (Sandbox Code Playgroud)

  • 如果您搜索该博客,还有其他的PowerShell示例,这些示例使新的PowerShell 3.0版更容易 (2认同)

Los*_*ode 25

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

或URL2文件:http:
//www.chami.com/free/url2file_wincon.html

在Linux中,您可以使用"wget".

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

  • 您不需要wget或任何第三方集成.BITS(自XP以来的标准Windows组件)可以使用MS命令行中的bitsadmin实用程序来完成.贴出来的答案 - 虽然有点晚了(落后2年?) (2认同)

Fra*_*ein 15

在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 normal "http://example.com/File.zip" "C:\Downloads\File.zip"

代理服务器:
要使用代理进行连接,请在下载前使用此命令.
bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"

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


自定义功能
:DOWNLOAD_FILE "URL"
:DOWNLOAD_PROXY_ON "SERVER:PORT"
: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 normal %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
Run Code Online (Sandbox Code Playgroud)

下载EXAMPLE.CMD

@ECHO OFF
SETLOCAL

rem FOR DOWNLOADING, 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 DOWNLOADING A PICTURE (URL):
SET "FILE_URL=https://upload.wikimedia.org/wikipedia/en/8/86/Einstein_tongue.jpg"

rem SAVING FILE TO THE SCRIPT FOLDER:
SET "SAVING_TO=Einstein_tongue.jpg"
SET "SAVING_TO=%~dp0%SAVING_TO%"

rem OR, UNCOMMENT NEXT LINE FOR SAVING TO ANY OTHER PATH:
rem SET "SAVING_TO=C:\Folder\Einstein_tongue.jpg"


:MAIN

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 HERE IS THE MAIN DOWNLOADING COMMAND:
CALL :DOWNLOAD_FILE "%FILE_URL%" "%SAVING_TO%"

rem UNCOMMENT NEXT LINE FOR DISABLING ANY PROXY:
rem CALL :DOWNLOAD_PROXY_OFF

ECHO.

rem THIS IS THE END...
PAUSE
EXIT /B




rem FUNCTIONS SECTION


:DOWNLOAD_FILE
    rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
    bitsadmin /transfer mydownloadjob /download /priority normal %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
Run Code Online (Sandbox Code Playgroud)

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

Kal*_*oni 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
Run Code Online (Sandbox Code Playgroud)

然后

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
Run Code Online (Sandbox Code Playgroud)

或者只需双击它即可在Windows中进行测试

  • 你好,它在哪里下载文件?谢谢 (3认同)
  • 这只是下载到内存中,还没有写入文件。检查此答案以下载到文件中:http://stackoverflow.com/a/2973344/977804 (2认同)

npo*_*aka 6

卷曲

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

curl "https://download.sysinternals.com/files/PSTools.zip" --output pstools.zip
Run Code Online (Sandbox Code Playgroud)

比特管理员

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

set "download=bitsadmin /transfer myDownloadJob /download /priority normal"
%download% "https://download.sysinternals.com/files/PSTools.zip" %cd%\pstools.zip
Run Code Online (Sandbox Code Playgroud)

Winhttp com 对象

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

call winhhtpjs.bat "https://example.com/files/some.zip" -saveTo "c:\somezip.zip" 
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

这里有更多解释


Mat*_*ock 3

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