Download de arquivo em lote do Windows de um URL


113

Estou tentando fazer download de um arquivo de um site (ex. Http://www.example.com/package.zip ) usando um arquivo em lote do Windows. Estou recebendo um código de erro quando escrevo a função abaixo:

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

O arquivo em lote não parece gostar do "/" após o http. Existe alguma maneira de escapar desses caracteres para que não presuma que sejam parâmetros de função?


Aqui: stackoverflow.com/questions/28143160/… Tentei retomar as maneiras de como um arquivo pode ser baixado no Windows usando apenas ferramentas nativas, sem software de terceiros.
npocmaka

Respostas:


137

Com o PowerShell 2.0 (Windows 7 pré-instalado), você pode usar:

(New-Object Net.WebClient).DownloadFile('http://www.example.com/package.zip', 'package.zip')

A partir do PowerShell 3.0 (Windows 8 pré-instalado), você pode usar Invoke-WebRequest:

Invoke-WebRequest http://www.example.com/package.zip -OutFile package.zip

Em um arquivo em lote, eles são chamados de:

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 está disponível para instalação no XP, 3.0 para Windows 7)


2
Legal! Melhor do que bitsadmin.exe, porque não está obsoleto.
sinelaw

@sevenforce, o comando Powershell 2.0 também funciona no Powershell 3.0 ou você precisa usar a sintaxe do Powershell 3.0?
Rich Signell de

4
@RichSignell: o comando 2.0 também funciona no 3.0. Para o comando 2.0, notei a propósito, que para um caminho de destino não absoluto, o arquivo será salvo em relação à pasta inicial do usuário.
sevenforce de

1
Isso é incrível. Eu estive procurando por isso por muito tempo. Obrigado! Ainda funciona em 2017.
Albert MN.

2
O código 2.0 está funcionando para mim em up-to-date Win 7. E uma vez que ele também funciona sem dar permissões de administração do PowerShell, deixe esta posição como uma prova perfeita do conceito de que clicar no desconhecido .bate .ps1arquivos pode realmente estragar o seu material.
1934286

97

Existe um componente padrão do Windows que pode realizar o que você está tentando fazer: BITS . Ele foi incluído no Windows desde XP e 2000 SP3.

Corre:

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

O nome do trabalho é simplesmente o nome de exibição do trabalho de download - defina-o como algo que descreve o que você está fazendo.


14
Ótima ferramenta! Mas meu win8 diz: "BITSAdmin está obsoleto e não é garantido que esteja disponível em versões futuras do Windows. Ferramentas administrativas para o serviço BITS agora são fornecidas por cmdlets BITS PowerShell."
Peteter,

1
Como já mencionei, o bitsadmin não está funcionando em lotes automáticos executados no agendador de tarefas :(
TomeeNS

1
@cmroanirgo bitsadminnão está disponível no Windows XP Home Edition.
estilo cascata de

1
Ainda está forte no Windows 10 Pro
Orwellophile,

3
Obrigado! Funcionou como um encanto em um computador infectado, sem outra forma possível de baixar um arquivo da web. (Até o PowerShell era impossível de lançar)
szab.kel

29

Isso pode ser um pouco fora do assunto, mas você pode facilmente baixar um arquivo usando o Powershell . O Powershell vem com versões modernas do Windows para que você não precise instalar nenhum equipamento extra no computador. Aprendi a fazer isso lendo esta página:

http://teusje.wordpress.com/2011/02/19/download-file-with-powershell/

O código era:

$webclient = New-Object System.Net.WebClient
$url = "http://www.example.com/file.txt"
$file = "$pwd\file.txt"
$webclient.DownloadFile($url,$file)

2
Se você pesquisar o blog há outras amostras PowerShell que tornam mais fácil com o novo PowerShell versão 3.0
jufo

Eu não acho que você precisa SystememSystem.Net.WebClient
1934286

25

A última vez que verifiquei, não há um comando de linha de comando para se conectar a um URL da linha de comando do MS. Experimente o wget para Windows:
http://gnuwin32.sourceforge.net/packages/wget.htm

ou URL2File:
http://www.chami.com/free/url2file_wincon.html

No Linux, você pode usar "wget".

Como alternativa, você pode tentar o VBScript. Eles são como programas de linha de comando, mas são scripts interpretados pelo host de scripts wscript.exe. Aqui está um exemplo de download de um arquivo usando VBS:
/server/29707/download-file-from-vbscript


2
Você não precisa do wget ou de qualquer integração de terceiros. O BITS (componente padrão do Windows desde o XP) pode fazer isso com o utilitário bitsadmin da linha de comando do MS. Resposta postada - embora um pouco tarde (2 anos atrás?)
Brainwood

18

Baixando arquivos em PURE BATCH ...

Sem qualquer JScript, VBScript, Powershell, etc ... Apenas puro Batch!

Algumas pessoas estão dizendo que não é possível baixar arquivos com um script em lote sem usar JScript ou VBScript, etc ... Mas eles estão definitivamente errados!

Aqui está um método simples que parece funcionar muito bem para baixar arquivos em seus scripts em lote. Deve estar funcionando em quase qualquer URL de arquivo. É até possível usar um servidor proxy, se necessário.

Para baixar arquivos, podemos usar o BITSADMIN.EXE do sistema Windows. Não há necessidade de baixar / instalar nada ou usar qualquer JScript ou VBScript, etc. O Bitsadmin.exe está presente na maioria das versões do Windows, provavelmente do XP ao Windows 10.

Aproveitar!


USO:

Você pode usar o comando BITSADMIN diretamente, desta forma:
bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "http://example.com/File.zip" "C:\Downloads\File.zip"

Servidor proxy:
Para conectar-se usando um proxy, use este comando antes de baixar.
bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"

Clique neste LINK se quiser mais informações sobre BITSadmin.exe


SOLUÇÃO DE PROBLEMAS:
Se você receber este erro: "Não foi possível conectar ao BITS - 0x80070422",
certifique-se de que o serviço do Windows "Serviço de transferência inteligente de plano de fundo (BITS)" esteja ativado e tente novamente. (Deve estar habilitado por padrão.)


FUNÇÕES PERSONALIZADAS
Call :DOWNLOAD_FILE "URL"
Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
Call :DOWNLOAD_PROXY_OFF

Fiz essas 3 funções para simplificar os comandos bitsadmin. É mais fácil de usar e lembrar. Pode ser particularmente útil se você o estiver usando várias vezes em seus scripts.

ATENÇÃO ...
Antes de usar essas funções, primeiro você precisa copiá-las de CUSTOM_FUNCTIONS.CMD para o final do seu script. Há também um exemplo completo: DOWNLOAD-EXAMPLE.CMD

: DOWNLOAD_FILE "URL"
A função principal, irá baixar os arquivos de URL.

: DOWNLOAD_PROXY_ON "SERVER: PORT"
(Opcional) Você pode usar esta função se precisar usar um servidor proxy.
Chamar a função: DOWNLOAD_PROXY_OFF desabilitará o servidor proxy.

EXEMPLO:
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

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

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

1
Acabei de atualizar minha resposta ... Aparentemente, a velocidade de download estava incrivelmente lenta, então mudei o parâmetro de "/ prioridade normal" para "/ prioridade primeiro plano" e corrigiu o problema. Ele deve estar usando agora 100% de sua largura de banda disponível. (Em vez de ~ 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

então

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

ou apenas clique duas vezes para testar no windows


1
Isso está apenas baixando para a memória e não gravando em um arquivo ainda. Verifique esta resposta para fazer o download em um arquivo: stackoverflow.com/a/2973344/977804
Daniel

5

AFAIK, o Windows não tem uma ferramenta de linha de comando embutida para baixar um arquivo. Mas você pode fazer isso a partir de um VBScript e pode gerar o arquivo VBScript em lote usando eco e redirecionamento de saída:

@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

Mais explicação aqui


Há algum motivo para não fazer isso em um arquivo separado e simplesmente chamar o arquivo VBScript do lote? Vai ser uma bagunça terrível se você precisar editá-lo.
seadoggie01

4
  1. Baixe o Wget aqui http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. Em seguida, instale-o.

  3. Em seguida, crie um arquivo .bat e coloque-o nele

    @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. Ajuste o URL e o caminho do arquivo no script

  5. Execute o arquivo e lucre!


3

Se bitsadmin não é sua preferência, você pode usar este comando do PowerShell:

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

Quero fazer o download do .exe e também usei esse código e não funcionou. Posso fazer o download do .exe usando o script em lote?
MAS. João,

3

Use Bat To Exe Converter

Crie um arquivo em lote e coloque algo como o código abaixo nele

%extd% /download http://www.examplesite.com/file.zip file.zip

ou

%extd% /download http://stackoverflow.com/questions/4619088/windows-batch-file-file-download-from-a-url thistopic.html

e convertê-lo em exe.


3

Em vez do wget, você também pode usar aria2 para baixar o arquivo de um URL específico.

Veja o seguinte link que explicará mais sobre aria2:

https://aria2.github.io/


+1 por mencionar essa ferramenta que eu ainda não conhecia. pena que tem problemas com HTTPS como o wget (ainda não encontrei uma maneira de configurar uma cadeia CA)
Jeroen Wiert Pluimers

2

BATCH pode não ser capaz de fazer isso, mas você pode usar JScript ou VBScript se não quiser usar ferramentas que não são instaladas por padrão com o Windows.

O primeiro exemplo nesta página baixa um arquivo binário em VBScript: http://www.robvanderwoude.com/vbstech_internet_download.php

Esta resposta do SO baixa um arquivo usando JScript (IMO, a melhor linguagem): Windows Script Host (jscript): como faço para baixar um arquivo binário?

Seu script de lote pode então chamar um JScript ou VBScript que baixa o arquivo.


2

Isso deve funcionar. Eu fiz o seguinte para um projeto de servidor de jogo. Ele irá baixar o zip e extraí-lo para qualquer diretório que você especificar.

Salvar como name.bat ou name.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

Original: https://github.com/C0nw0nk/SteamCMD-AutoUpdate-Any-Gameserver/blob/master/steam.cmd


Quero baixar o .exe e usei esse código e não funcionou. Posso baixar o .exe usando o script em lote?
MAS. João,

1

Encontrei este script VB:

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

Funciona como um encanto. Configurado como uma função com uma chamada de função muito simples:

SaveWebBinary "http://server/file1.ext1", "C:/file2.ext2"

Originalmente de: http://www.ericphelps.com/scripting/samples/BinaryDownload/index.htm

Aqui está o código completo para redundância:

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

Esta pergunta tem uma resposta muito boa aqui . Meu código é puramente baseado nessa resposta com algumas modificações.

Salve o snippet abaixo como wget.bat e coloque-o no caminho do sistema (por exemplo, coloque-o em um diretório e adicione este diretório ao caminho do sistema).

Você pode usá-lo em seu cli da seguinte maneira:

wget url/to/file [?custom_name]

onde url_to_fileé obrigatório e custom_nameopcional

  1. Se o nome não for fornecido, o arquivo baixado será salvo com seu próprio nome no url.
  2. Se o nome for fornecido, o arquivo será salvo com o novo nome.

O url do arquivo e os nomes dos arquivos salvos são exibidos em texto colorido ansi. Se isso está causando problemas para você, verifique este projeto 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 Este código requer que você tenha o PowerShell instalado.


1

Você pode configurar uma tarefa agendada usando wget, use o campo “Executar” na tarefa agendada como:

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

1

Há um utilitário (reside no CMD) no Windows que pode ser executado a partir do CMD (se você tiver acesso de gravação):

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.

Aplicativo integrado do Windows. Não há necessidade de downloads externos.

Testado no Win 10


-3

use ftp:

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

Altere tudo em asteriscos para se adequar à sua situação.


Certamente depende do servidor que hospeda o arquivo para suportar FTP.
PnP

Questin está relacionado ao http, não ao ftp
Ben
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.