Download di file batch di Windows da un URL


113

Sto cercando di scaricare un file da un sito Web (es. Http://www.example.com/package.zip ) utilizzando un file batch di Windows. Ricevo un codice di errore quando scrivo la funzione di seguito:

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

Il file batch non sembra gradire la "/" dopo http. Esistono modi per sfuggire a quei caratteri in modo che non si presume siano parametri di funzione?


Qui: stackoverflow.com/questions/28143160/… Ho provato a riprendere i modi in cui un file può essere scaricato in Windows utilizzando solo strumenti nativi senza software di terze parti.
npocmaka

Risposte:


136

Con PowerShell 2.0 (Windows 7 preinstallato) è possibile utilizzare:

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

A partire da PowerShell 3.0 (Windows 8 preinstallato) è possibile utilizzare Invoke-WebRequest:

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

Da un file batch vengono chiamati:

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 è disponibile per l'installazione su XP, 3.0 per Windows 7)


2
Freddo! Meglio di bitsadmin.exe, perché non è deprecato.
sinelaw

@sevenforce, Fa il comando PowerShell 2.0 anche il lavoro in PowerShell 3.0, o si hanno di utilizzare tale PowerShell 3.0 sintassi?
Rich Signell

4
@RichSignell: il comando 2.0 funziona anche in 3.0. Per il comando 2.0 ho notato tra l'altro che per un percorso di destinazione non assoluto il file verrà salvato relativamente alla cartella home dell'utente.
sevenforce

1
Questo è fantastico. Lo stavo cercando da così tanto tempo. Grazie! Funziona ancora nel 2017.
Albert MN.

2
Il codice 2.0 funziona per me su Win 7. E poiché funziona anche senza dare i permessi di amministratore a PowerShell, lascia che questo sia una prova perfetta del fatto che fare clic su file .bate sconosciuti .ps1può davvero rovinare le tue cose.
1934286

97

C'è un componente Windows standard che può ottenere ciò che stai cercando di fare: BITS . È stato incluso in Windows da XP e 2000 SP3.

Correre:

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

Il nome del lavoro è semplicemente il nome visualizzato per il lavoro di download: impostalo su qualcosa che descriva ciò che stai facendo.


14
Bel strumento! Ma il mio win8 dice: "BITSAdmin è deprecato e non è garantito che sarà disponibile nelle versioni future di Windows. Gli strumenti di amministrazione per il servizio BITS sono ora forniti dai cmdlet di BITS PowerShell".
Peteter

1
Come ho già detto, bitsadmin non funziona in batch automatici eseguiti
dall'utilità di

1
@cmroanirgo bitsadminnon è disponibile in Windows XP Home Edition.
in stile cascata

1
Ancora andando forte in Windows 10 Pro
Orwellophile

3
Grazie! Ha funzionato a meraviglia su un computer infetto senza nessun altro modo possibile per scaricare un file dal web. (Anche PowerShell era impossibile da avviare)
szab.kel

29

Questo potrebbe essere un po 'fuori tema, ma puoi facilmente scaricare un file usando Powershell . Powershell viene fornito con le versioni moderne di Windows, quindi non devi installare alcun materiale aggiuntivo sul computer. Ho imparato come farlo leggendo questa pagina:

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

Il codice era:

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

2
Se cerchi in quel blog ci sono altri esempi di PowerShell che lo rendono più facile con la nuova versione 3.0 di PowerShell
juFo

Non penso che tu abbia bisogno SystemdiSystem.Net.WebClient
1934286

25

L'ultima volta che ho controllato, non esiste un comando della riga di comando per connettersi a un URL dalla riga di comando di MS. Prova wget per Windows:
http://gnuwin32.sourceforge.net/packages/wget.htm

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

In Linux, puoi usare "wget".

In alternativa, puoi provare VBScript. Sono come programmi a riga di comando, ma sono script interpretati dall'host degli script wscript.exe. Ecco un esempio di download di un file utilizzando VBS:
/server/29707/download-file-from-vbscript


2
Non hai bisogno di wget o di alcuna integrazione di terze parti. BITS (componente Windows standard da XP) può farlo con l'utilità bitsadmin dalla riga di comando di MS. Risposta pubblicata - anche se un po 'in ritardo (2 anni indietro?)
brainwood

18

Download dei file in PURE BATCH ...

Senza JScript, VBScript, Powershell, ecc ... Solo puro Batch!

Alcune persone dicono che non è possibile scaricare file con uno script batch senza utilizzare JScript o VBScript, ecc ... Ma si sbagliano decisamente!

Ecco un metodo semplice che sembra funzionare abbastanza bene per scaricare i file negli script batch. Dovrebbe funzionare su quasi tutti gli URL dei file. È anche possibile utilizzare un server proxy, se necessario.

Per scaricare i file, possiamo utilizzare BITSADMIN.EXE dal sistema Windows. Non è necessario scaricare / installare nulla o utilizzare JScript o VBScript, ecc. Bitsadmin.exe è presente sulla maggior parte delle versioni di Windows, probabilmente da XP a Windows 10.

Godere!


USO:

Puoi usare direttamente il comando BITSADMIN, in questo modo:
bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "http://example.com/File.zip" "C:\Downloads\File.zip"

Server proxy:
per connettersi utilizzando un proxy, utilizzare questo comando prima del download.
bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"

Fare clic su questo LINK se si desiderano ulteriori informazioni su BITSadmin.exe


RISOLUZIONE DEI PROBLEMI:
Se viene visualizzato questo errore: "Impossibile connettersi a BITS - 0x80070422"
Assicurati che il servizio Windows "Servizio trasferimento intelligente in background (BITS)" sia abilitato e riprova. (Dovrebbe essere abilitato per impostazione predefinita.)


FUNZIONI PERSONALIZZATE
Call :DOWNLOAD_FILE "URL"
Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
Call :DOWNLOAD_PROXY_OFF

Ho creato queste 3 funzioni per semplificare i comandi bitsadmin. È più facile da usare e da ricordare. Può essere particolarmente utile se lo usi più volte nei tuoi script.

NOTA BENE ...
Prima di utilizzare queste funzioni, dovrai prima copiarle da CUSTOM_FUNCTIONS.CMD alla fine del tuo script. C'è anche un esempio completo: DOWNLOAD-EXAMPLE.CMD

: DOWNLOAD_FILE "URL"
La funzione principale, scaricherà i file da URL.

: DOWNLOAD_PROXY_ON "SERVER: PORT"
(Opzionale) È possibile utilizzare questa funzione se è necessario utilizzare un server proxy.
La chiamata alla funzione: DOWNLOAD_PROXY_OFF disabiliterà il server proxy.

ESEMPIO:
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
Ho appena aggiornato la mia risposta ... Apparentemente, la velocità di download era follemente lenta, quindi ho cambiato il parametro da "/ priority normal" a "/ priority foreground" e ha risolto il problema. Dovrebbe utilizzare ora il 100% della larghezza di banda disponibile. (Invece di ~ 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

poi

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

o fai semplicemente doppio clic per eseguire il test in Windows


1
Questo è solo il download in memoria e non ancora la scrittura su un file. Controlla questa risposta per il download in un file: stackoverflow.com/a/2973344/977804
Daniel

5

AFAIK, Windows non ha uno strumento a riga di comando integrato per scaricare un file. Ma puoi farlo da un VBScript e puoi generare il file VBScript da batch usando l'eco e il reindirizzamento dell'output:

@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

Ulteriori spiegazioni qui


Qualche motivo per non farlo in un file separato e chiamare semplicemente il file VBScript dal batch? Questo sarà un terribile pasticcio se dovessi mai modificarlo.
seadoggie01

4
  1. Scarica Wget da qui http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. Quindi installalo.

  3. Quindi crea un file .bat e inseriscilo

    @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. Modifica l'URL e il percorso del file nello script

  5. Esegui il file e guadagna!


3

Se bitsadmin non fa per te, puoi utilizzare questo comando di PowerShell:

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

voglio scaricare .exe e ho anche usato questo codice e non ha funzionato .. Posso scaricare .exe usando lo script batch?
MAS. Giovanni

3

Usa Bat To Exe Converter

Crea un file batch e inserisci qualcosa come il codice qui sotto

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

o

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

e convertirlo in exe.


3

Invece di wget puoi anche usare aria2 per scaricare il file da un particolare URL.

Vedi il seguente link che spiegherà di più su aria2:

https://aria2.github.io/


+1 per aver menzionato questo strumento che ancora non conoscevo. peccato che abbia problemi con HTTPS come ha wget (non ho ancora trovato un modo per impostare una catena CA)
Jeroen Wiert Pluimers

2

BATCH potrebbe non essere in grado di farlo, ma puoi usare JScript o VBScript se non vuoi usare strumenti che non sono installati per impostazione predefinita con Windows.

Il primo esempio in questa pagina scarica un file binario in VBScript: http://www.robvanderwoude.com/vbstech_internet_download.php

Questa risposta SO scarica un file utilizzando JScript (IMO, la lingua migliore): Windows Script Host (jscript): come faccio a scaricare un file binario?

Lo script batch può quindi richiamare semplicemente un JScript o VBScript che scarica il file.


2

Questo dovrebbe funzionare. Ho fatto quanto segue per un progetto di server di gioco. Scaricherà lo zip e lo estrarrà nella directory specificata.

Salva come name.bat o 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

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


voglio scaricare .exe e ho usato questo codice e non ha funzionato .. Posso scaricare .exe usando lo script batch?
MAS. Giovanni

1

Ho trovato questo script VB:

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

Funziona come un fascino. Configurato come una funzione con una chiamata di funzione molto semplice:

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

Originariamente da: http://www.ericphelps.com/scripting/samples/BinaryDownload/index.htm

Ecco il codice completo per la ridondanza:

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

Questa domanda ha un'ottima risposta qui . Il mio codice si basa esclusivamente su quella risposta con alcune modifiche.

Salva sotto lo snippet come wget.bat e mettilo nel tuo percorso di sistema (es. Mettilo in una directory e aggiungi questa directory al percorso di sistema).

Puoi usarlo nella tua cli come segue:

wget url/to/file [?custom_name]

dove url_to_fileè obbligatorio ed custom_nameè facoltativo

  1. Se il nome non viene fornito, il file scaricato verrà salvato con il proprio nome dall'URL.
  2. Se viene fornito il nome, il file verrà salvato con il nuovo nome.

L'URL del file e i nomi dei file salvati vengono visualizzati in un testo colorato. Se questo ti sta causando problemi, controlla questo progetto 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 Questo codice richiede l'installazione di PowerShell.


1

È possibile impostare un'attività pianificata utilizzando wget, utilizzare il campo "Esegui" nell'attività pianificata come:

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

1

C'è un'utilità (risiede con CMD) su Windows che può essere eseguita da CMD (se si dispone dell'accesso in scrittura):

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.

Applicazione Windows integrata. Non sono necessari download esterni.

Testato su Win 10


-3

usa ftp:

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

Cambia tutto in asterischi per adattarlo alla tua situazione.


Sicuramente dipende dal server che ospita il file per supportare FTP.
PnP

Questin è correlato a http, non ftp
Ben
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.