Téléchargement du fichier de commandes Windows à partir d'une URL


113

J'essaie de télécharger un fichier à partir d'un site Web (ex. Http://www.example.com/package.zip ) à l'aide d'un fichier batch Windows. J'obtiens un code d'erreur lorsque j'écris la fonction ci-dessous:

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

Le fichier de commandes ne semble pas aimer le "/" après le http. Existe-t-il des moyens d'échapper à ces caractères pour ne pas supposer qu'il s'agit de paramètres de fonction?


Ici: stackoverflow.com/questions/28143160/ ... J'ai essayé de reprendre les moyens de télécharger un fichier sous Windows en utilisant uniquement des outils natifs sans logiciel tiers.
npocmaka

Réponses:


137

Avec PowerShell 2.0 (Windows 7 préinstallé), vous pouvez utiliser:

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

À partir de PowerShell 3.0 (Windows 8 préinstallé), vous pouvez utiliser Invoke-WebRequest:

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

À partir d'un fichier batch, ils sont appelés:

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 disponible pour l'installation sur XP, 3.0 pour Windows 7)


2
Cool! Mieux que bitsadmin.exe, car il n'est pas obsolète.
sinelaw

@sevenforce, Est -ce que la commande Powershell 2.0 aussi de travail dans Powershell 3.0, ou avez - vous avoir à utiliser cette syntaxe Powershell 3.0?
Rich Signell

4
@RichSignell: la commande 2.0 fonctionne également en 3.0. Pour la commande 2.0, j'ai remarqué en passant que pour un chemin cible non absolu, le fichier sera enregistré par rapport au dossier personnel de l'utilisateur.
sevenforce

1
Ceci est incroyable. Je cherchais ça depuis si longtemps. Je vous remercie! Fonctionne toujours en 2017.
Albert MN.

2
Le code 2.0 fonctionne pour moi sur la mise à jour de Win 7. Et comme il fonctionne également sans donner les autorisations d'administrateur PowerShell, laissez cela comme une preuve de concept parfaite que cliquer sur des fichiers inconnus .batet des .ps1fichiers peut vraiment gâcher vos affaires.
1934286

97

Il existe un composant Windows standard qui peut réaliser ce que vous essayez de faire: BITS . Il est inclus dans Windows depuis XP et 2000 SP3.

Courir:

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

Le nom du travail est simplement le nom d'affichage du travail de téléchargement - définissez-le sur quelque chose qui décrit ce que vous faites.


14
Bel outil! Mais mon win8 dit: "BITSAdmin est obsolète et il n'est pas garanti d'être disponible dans les futures versions de Windows. Les outils d'administration pour le service BITS sont désormais fournis par les applets de commande BITS PowerShell."
Peteter

1
Comme je l'ai déjà mentionné, bitsadmin ne fonctionne pas dans les lots automatiques exécutés à partir du planificateur de tâches :(
TomeeNS

1
@cmroanirgo bitsadminn'est pas disponible dans Windows XP Édition familiale.
de style en cascade

1
Toujours aussi fort dans Windows 10 Pro
Orwellophile

3
Je vous remercie! A fonctionné comme un charme sur un ordinateur infecté sans autre moyen possible de télécharger un fichier à partir du Web. (Même PowerShell était impossible à lancer)
szab.kel

29

Cela peut être un peu hors sujet, mais vous pouvez assez facilement télécharger un fichier à l'aide de Powershell . Powershell est fourni avec des versions modernes de Windows afin que vous n'ayez pas à installer de choses supplémentaires sur l'ordinateur. J'ai appris à le faire en lisant cette page:

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

Le code était:

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

2
Si vous recherchez dans ce blog, il existe d'autres exemples PowerShell qui facilitent la tâche avec la nouvelle version 3.0 de PowerShell
juFo

Je ne pense pas que vous ayez besoin SystemdeSystem.Net.WebClient
1934286

25

La dernière fois que j'ai vérifié, il n'y a pas de commande de ligne de commande pour se connecter à une URL à partir de la ligne de commande MS. Essayez wget pour Windows:
http://gnuwin32.sourceforge.net/packages/wget.htm

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

Sous Linux, vous pouvez utiliser "wget".

Vous pouvez également essayer VBScript. Ils sont comme des programmes de ligne de commande, mais ce sont des scripts interprétés par l'hôte de scripts wscript.exe. Voici un exemple de téléchargement d'un fichier à l'aide de VBS:
/server/29707/download-file-from-vbscript


2
Vous n'avez pas besoin de wget ou d'une intégration tierce. BITS (composant Windows standard depuis XP) peut le faire avec l'utilitaire bitsadmin à partir de la ligne de commande MS. Réponse publiée - bien qu'un peu tard (2 ans de retard?)
brainwood

18

Téléchargement de fichiers dans PURE BATCH ...

Sans JScript, VBScript, Powershell, etc ... Seulement du pur Batch!

Certaines personnes disent qu'il n'est pas possible de télécharger des fichiers avec un script batch sans utiliser de JScript ou VBScript, etc ... Mais ils se trompent définitivement!

Voici une méthode simple qui semble fonctionner assez bien pour télécharger des fichiers dans vos scripts batch. Il devrait fonctionner sur presque toutes les URL de fichiers. Il est même possible d'utiliser un serveur proxy si vous en avez besoin.

Pour télécharger des fichiers, nous pouvons utiliser BITSADMIN.EXE à partir du système Windows. Il n'est pas nécessaire de télécharger / installer quoi que ce soit ou d'utiliser n'importe quel JScript ou VBScript, etc. Bitsadmin.exe est présent sur la plupart des versions de Windows, probablement de XP à Windows 10.

Prendre plaisir!


USAGE:

Vous pouvez utiliser la commande BITSADMIN directement, comme ceci:
bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "http://example.com/File.zip" "C:\Downloads\File.zip"

Serveur proxy:
pour vous connecter à l'aide d'un proxy, utilisez cette commande avant de télécharger.
bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"

Cliquez sur ce LIEN si vous voulez plus d'informations sur BITSadmin.exe


DEPANNAGE:
Si vous obtenez cette erreur: «Impossible de se connecter à BITS - 0x80070422»
Assurez-vous que le service Windows «Service de transfert intelligent en arrière-plan (BITS)» est activé et réessayez. (Il doit être activé par défaut.)


FONCTIONS PERSONNALISÉES
Call :DOWNLOAD_FILE "URL"
Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
Call :DOWNLOAD_PROXY_OFF

J'ai créé ces 3 fonctions pour simplifier les commandes bitsadmin. C'est plus facile à utiliser et à retenir. Cela peut être particulièrement utile si vous l'utilisez plusieurs fois dans vos scripts.

VEUILLEZ NOTER ...
Avant d'utiliser ces fonctions, vous devrez d'abord les copier de CUSTOM_FUNCTIONS.CMD à la fin de votre script. Il existe également un exemple complet: DOWNLOAD-EXAMPLE.CMD

: DOWNLOAD_FILE "URL"
La fonction principale, va télécharger des fichiers depuis l'URL.

: DOWNLOAD_PROXY_ON "SERVER: PORT"
(facultatif) Vous pouvez utiliser cette fonction si vous devez utiliser un serveur proxy.
L'appel de la fonction: DOWNLOAD_PROXY_OFF désactivera le serveur proxy.

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

TELECHARGER-EXEMPLE.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
Je viens de mettre à jour ma réponse ... Apparemment, la vitesse de téléchargement était incroyablement lente, donc j'ai changé le paramètre de "/ priority normal" à "/ priority avant plan" et cela a résolu le problème. Il devrait utiliser maintenant 100% de votre bande passante disponible. (Au lieu 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

puis

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 double-cliquez dessus pour tester dans Windows


1
Il s'agit uniquement de télécharger dans la mémoire et pas encore d'écrire dans un fichier. Vérifiez cette réponse pour le téléchargement dans un fichier: stackoverflow.com/a/2973344/977804
Daniel

5

AFAIK, Windows n'a pas d'outil de ligne de commande intégré pour télécharger un fichier. Mais vous pouvez le faire à partir d'un VBScript, et vous pouvez générer le fichier VBScript à partir d'un lot en utilisant l'écho et la redirection de sortie:

@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

Plus d'explications ici


Une raison de ne pas le faire dans un fichier séparé et d'appeler simplement le fichier VBScript à partir du lot? Ce sera un désordre terrible si jamais vous avez besoin de le modifier.
seadoggie01

4
  1. Téléchargez Wget à partir d'ici http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. Puis installez-le.

  3. Ensuite, créez un fichier .bat et mettez-le dedans

    @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. Ajustez l'URL et le chemin du fichier dans le script

  5. Exécutez le fichier et profitez!


3

Si bitsadmin n'est pas votre tasse de thé, vous pouvez utiliser cette commande PowerShell:

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

Je veux télécharger .exe et j'ai également utilisé ce code et n'a pas fonctionné .. Puis-je télécharger .exe en utilisant un script batch?
MAS. John

3

Utilisez Bat To Exe Converter

Créez un fichier batch et mettez-y quelque chose comme le code ci-dessous

%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

et le convertir en exe.


3

Au lieu de wget, vous pouvez également utiliser aria2 pour télécharger le fichier à partir d'une URL particulière.

Voir le lien suivant qui vous en expliquera plus sur aria2:

https://aria2.github.io/


+1 pour avoir mentionné cet outil que je ne connaissais pas encore. dommage qu'il ait des problèmes avec HTTPS comme wget a (je n'ai pas encore trouvé de moyen de configurer une chaîne CA)
Jeroen Wiert Pluimers

2

BATCH ne pourra peut-être pas faire cela, mais vous pouvez utiliser JScript ou VBScript si vous ne souhaitez pas utiliser d'outils qui ne sont pas installés par défaut avec Windows.

Le premier exemple de cette page télécharge un fichier binaire dans VBScript: http://www.robvanderwoude.com/vbstech_internet_download.php

Cette réponse SO télécharge un fichier en utilisant JScript (IMO, le meilleur langage): Windows Script Host (jscript): comment télécharger un fichier binaire?

Votre script batch peut alors simplement appeler un JScript ou VBScript qui télécharge le fichier.


2

Cela devrait fonctionner, j'ai fait ce qui suit pour un projet de serveur de jeu. Il téléchargera le zip et l'extrayera dans le répertoire que vous spécifiez.

Enregistrer sous nom.bat ou nom.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


Je veux télécharger .exe et j'ai utilisé ce code et je n'ai pas travaillé .. Puis-je télécharger .exe en utilisant un script batch?
MAS. John

1

J'ai trouvé ce script VB:

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

Fonctionne comme un charme. Configuré comme une fonction avec un appel de fonction très simple:

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

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

Voici le code complet de la redondance:

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

Cette question a une très bonne réponse ici . Mon code est purement basé sur cette réponse avec quelques modifications.

Enregistrer ci-dessous l'extrait de code sous wget.bat et placez-le dans votre chemin système (par exemple, placez-le dans un répertoire et ajoutez ce répertoire au chemin système.)

Vous pouvez l'utiliser dans votre cli comme suit:

wget url/to/file [?custom_name]

url_to_fileest obligatoire et custom_namefacultatif

  1. Si le nom n'est pas fourni, le fichier téléchargé sera enregistré sous son propre nom à partir de l'url.
  2. Si le nom est fourni, le fichier sera enregistré sous le nouveau nom.

L'URL du fichier et les noms de fichiers enregistrés sont affichés en texte de couleur ansi. Si cela vous pose problème, vérifiez ce projet 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 Ce code nécessite l'installation de PowerShell.


1

Vous pouvez configurer une tâche planifiée à l'aide de wget, utilisez le champ «Exécuter» dans la tâche planifiée comme:

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

1

Il existe un utilitaire (résidant avec CMD) sur Windows qui peut être exécuté à partir de CMD (si vous avez un accès en écriture):

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.

Application Windows intégrée. Pas besoin de téléchargements externes.

Testé sur Win 10


-3

utilisez ftp:

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

Modifiez tout dans les astérisques pour l'adapter à votre situation.


Sûrement dépendant du serveur hébergeant le fichier pour prendre en charge FTP.
PnP

Questin est lié à http, pas à ftp
Ben
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.