Descarga de archivos por lotes de Windows desde una URL

113

Estoy intentando descargar un archivo de un sitio web (por ejemplo, http://www.example.com/package.zip ) usando un archivo por lotes de Windows. Recibo un código de error cuando escribo la función a continuación:

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

Al archivo por lotes no parece gustarle la "/" después de http. ¿Hay alguna forma de escapar de esos caracteres para no asumir que son parámetros de función?

James
fuente
Aquí: stackoverflow.com/questions/28143160/… He intentado reanudar las formas en que se puede descargar un archivo en Windows utilizando solo herramientas nativas sin software de terceros.
npocmaka

Respuestas:

136

Con PowerShell 2.0 (Windows 7 preinstalado) puede usar:

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

A partir de PowerShell 3.0 (Windows 8 preinstalado), puede usar Invoke-WebRequest:

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

Desde un archivo por lotes se denominan:

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 para su instalación en XP, 3.0 para Windows 7)

Sevenforce
fuente
2
¡Frio! Mejor que bitsadmin.exe, porque no está en desuso.
sinelaw
@sevenforce, ¿El comando Powershell 2.0 también funciona en Powershell 3.0, o tiene que usar esa sintaxis de Powershell 3.0?
Rich Signell
4
@RichSignell: el comando 2.0 también funciona en 3.0. Para el comando 2.0 noté, por cierto, que para una ruta de destino no absoluta, el archivo se guardará en relación con la carpeta de inicio del usuario.
sevenforce
1
Esto es increíble. He estado buscando esto durante tanto tiempo. ¡Gracias! Todavía funciona en 2017.
Albert MN.
2
El código 2.0 me funciona en la versión actualizada de Win 7. Y dado que también funciona sin otorgar permisos de administrador a PowerShell, deje que esto sea una prueba perfecta del concepto de que hacer clic en archivos .baty desconocidos .ps1puede arruinar sus cosas.
1934286
97

Hay un componente estándar de Windows que puede lograr lo que está tratando de hacer: BITS . Se ha incluido en Windows desde XP y 2000 SP3.

Correr:

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

El nombre del trabajo es simplemente el nombre para mostrar del trabajo de descarga; configúrelo en algo que describa lo que está haciendo.

cerebro
fuente
14
¡Buena herramienta! Pero mi win8 dice: "BITSAdmin está obsoleto y no se garantiza que esté disponible en futuras versiones de Windows. Las herramientas administrativas para el servicio BITS ahora las proporcionan los cmdlets de BITS PowerShell".
Peteter
1
Como ya mencioné, bitsadmin no funciona en lotes automáticos que se ejecutan desde el programador de tareas :(
TomeeNS
1
@cmroanirgo bitsadminno está disponible en Windows XP Home Edition.
estilo en cascada
1
Todavía va fuerte en Windows 10 Pro
Orwellophile
3
¡Gracias! Funcionó a la perfección en una computadora infectada sin otra forma posible de descargar un archivo de la web. (Incluso PowerShell fue imposible de lanzar)
szab.kel
29

Esto puede estar un poco fuera de tema, pero puede descargar un archivo con bastante facilidad usando Powershell . Powershell viene con versiones modernas de Windows para que no tenga que instalar nada adicional en la computadora. Aprendí cómo hacerlo leyendo esta página:

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

El código era:

$webclient = New-Object System.Net.WebClient
$url = "http://www.example.com/file.txt"
$file = "$pwd\file.txt"
$webclient.DownloadFile($url,$file)
David Grayson
fuente
2
Si busca en ese blog, hay otras muestras de PowerShell que lo hacen más fácil con la nueva versión 3.0 de PowerShell
juFo
No creo que necesita SystemenSystem.Net.WebClient
1934286
25

La última vez que verifiqué, no hay un comando de línea de comando para conectarse a una URL desde la línea de comando de MS. Pruebe wget para Windows:
http://gnuwin32.sourceforge.net/packages/wget.htm

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

En Linux, puede utilizar "wget".

Alternativamente, puede probar VBScript. Son como programas de línea de comandos, pero son scripts interpretados por el host de scripts wscript.exe. Aquí hay un ejemplo de descarga de un archivo usando VBS:
/server/29707/download-file-from-vbscript

LostInTheCode
fuente
2
No necesita wget ni ninguna integración de terceros. BITS (Componente estándar de Windows desde XP) puede hacerlo con la utilidad bitsadmin desde la línea de comandos de MS. Respuesta publicada, aunque un poco tarde (¿2 años de retraso?)
Brainwood
18

Descargando archivos en PURE BATCH ...

Sin JScript, VBScript, Powershell, etc ... ¡Solo puro Batch!

Algunas personas dicen que no es posible descargar archivos con un script por lotes sin usar JScript o VBScript, etc. ¡Pero definitivamente están equivocados!

Aquí hay un método simple que parece funcionar bastante bien para descargar archivos en sus scripts por lotes. Debería funcionar en casi cualquier URL de archivo. Incluso es posible utilizar un servidor proxy si lo necesita.

Para descargar archivos, podemos usar BITSADMIN.EXE desde el sistema de Windows. No es necesario descargar / instalar nada ni usar JScript o VBScript, etc. Bitsadmin.exe está presente en la mayoría de las versiones de Windows, probablemente desde XP hasta Windows 10.

¡Disfrutar!


USO:

Puede usar el comando BITSADMIN directamente, así:
bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "http://example.com/File.zip" "C:\Downloads\File.zip"

Servidor proxy:
para conectarse mediante un proxy, utilice este comando antes de descargar.
bitsadmin /setproxysettings mydownloadjob OVERRIDE "proxy-server.com:8080" "<local>"

Haga clic en este ENLACE si desea más información sobre BITSadmin.exe


SOLUCIÓN DE PROBLEMAS:
Si recibe este error: "No se puede conectar a BITS - 0x80070422"
Asegúrese de que el servicio de Windows "Servicio de transferencia inteligente en segundo plano (BITS)" esté habilitado y vuelva a intentarlo. (Debería estar habilitado de forma predeterminada).


FUNCIONES PERSONALIZADAS
Call :DOWNLOAD_FILE "URL"
Call :DOWNLOAD_PROXY_ON "SERVER:PORT"
Call :DOWNLOAD_PROXY_OFF

Hice estas 3 funciones para simplificar los comandos bitsadmin. Es más fácil de usar y recordar. Puede ser particularmente útil si lo usa varias veces en sus scripts.

TENGA EN CUENTA ...
Antes de usar estas funciones, primero deberá copiarlas de CUSTOM_FUNCTIONS.CMD al final de su script. También hay un ejemplo completo: DOWNLOAD-EXAMPLE.CMD

: DOWNLOAD_FILE "URL"
La función principal, descargará archivos desde la URL.

: DOWNLOAD_PROXY_ON "SERVER: PORT"
(Opcional) Puede utilizar esta función si necesita utilizar un servidor proxy.
Llamar a la función: DOWNLOAD_PROXY_OFF desactivará el servidor proxy.

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

DESCARGAR-EJEMPLO.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
Frank Einstein
fuente
1
Acabo de actualizar mi respuesta ... Aparentemente, la velocidad de descarga era increíblemente lenta, así que cambié el parámetro de "/ prioridad normal" a "/ prioridad en primer plano" y solucionó el problema. Debería utilizar ahora el 100% de su ancho de banda disponible. (En lugar 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

luego

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 simplemente haz doble clic en él para probarlo en Windows

Kalpesh Soni
fuente
1
Esto solo se descarga en la memoria y aún no se escribe en un archivo. Consulte esta respuesta para descargarla en un archivo: stackoverflow.com/a/2973344/977804
Daniel
5

AFAIK, Windows no tiene una herramienta de línea de comandos incorporada para descargar un archivo. Pero puede hacerlo desde un VBScript, y puede generar el archivo VBScript a partir de lotes utilizando el eco y la redirección de salida:

@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

Más explicación aquí

Abscisa
fuente
¿Alguna razón para no hacer esto en un archivo separado y simplemente llamar al archivo VBScript desde el lote? Esto va a ser un desastre terrible si alguna vez necesitas editarlo.
seadoggie01
4
  1. Descarga Wget desde aquí http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. Luego instálelo.

  3. Luego haz un archivo .bat y pon esto en él

    @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 la URL y la ruta del archivo en el script

  5. ¡Ejecute el archivo y benefíciese!
boksiora
fuente
3

No puede usar xcopy sobre http. Intente descargar wget para Windows. Eso puede hacer el truco. Es una utilidad de línea de comandos para la descarga no interactiva de archivos a través de http. Puede obtenerlo en http://gnuwin32.sourceforge.net/packages/wget.htm

Matt Wrock
fuente
3

Si bitsadmin no es lo tuyo, puedes usar este comando de PowerShell:

Start-BitsTransfer -Source http://www.foo.com/package.zip -Destination C:\somedir\package.zip
Trinitrotolueno
fuente
Quiero descargar .exe y también utilicé este código y no funcionó. ¿Puedo descargar .exe usando un script por lotes?
MAS. John
3

Use Bat To Exe Converter

Cree un archivo por lotes y coloque algo como el siguiente código en él

%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

y convertirlo a exe.

kentuckyschreit
fuente
3

En lugar de wget, también puede usar aria2 para descargar el archivo desde una URL en particular.

Vea el siguiente enlace que explicará más sobre aria2:

https://aria2.github.io/

Sasikumar
fuente
+1 por mencionar esta herramienta que aún no conocía. lástima que tiene problemas con HTTPS como wget (todavía no he encontrado una manera de configurar una cadena de CA)
Jeroen Wiert Pluimers
2

Es posible que BATCH no pueda hacer esto, pero puede usar JScript o VBScript si no desea usar herramientas que no están instaladas por defecto con Windows.

El primer ejemplo de esta página descarga un archivo binario en VBScript: http://www.robvanderwoude.com/vbstech_internet_download.php

Esta respuesta SO descarga un archivo usando JScript (IMO, el mejor lenguaje): Windows Script Host (jscript): ¿cómo descargo un archivo binario?

Su secuencia de comandos por lotes puede simplemente llamar a un JScript o VBScript que descarga el archivo.

aikeru
fuente
2

Esto debería funcionar. Hice lo siguiente para un proyecto de servidor de juegos. Descargará el zip y lo extraerá a cualquier directorio que especifique.

Guardar como nombre.bat o nombre.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

C0nw0nk
fuente
Quiero descargar .exe y usé este código y no funcionó. ¿Puedo descargar .exe usando un script por lotes?
MAS. John
1

Encontré este script de VB:

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

Funciona de maravilla. Configurado como una función con una llamada de función muy simple:

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

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

Aquí está el código completo de redundancia:

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
Casa en la playa
fuente
1

Esta pregunta tiene muy buena respuesta aquí . Mi código se basa puramente en esa respuesta con algunas modificaciones.

Guarde el siguiente fragmento como wget.bat y colóquelo en la ruta del sistema (por ejemplo, póngalo en un directorio y agregue este directorio a la ruta del sistema).

Puede usarlo en su cli de la siguiente manera:

wget url/to/file [?custom_name]

donde url_to_filees obligatorio y custom_namees opcional

  1. Si no se proporciona el nombre, el archivo descargado se guardará con su propio nombre de la URL.
  2. Si se proporciona el nombre, el archivo se guardará con el nuevo nombre.

La URL del archivo y los nombres de archivo guardados se muestran en texto ansi en color. Si eso le está causando problemas, consulte este proyecto de 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

PD: Este código requiere que tengas PowerShell instalado.

bantya
fuente
1

Puede configurar una tarea programada usando wget, use el campo "Ejecutar" en la tarea programada como:

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

Hay una utilidad (reside con CMD) en Windows que se puede ejecutar desde CMD (si tiene acceso de escritura):

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.

Aplicación de Windows incorporada. Sin necesidad de descargas externas.

Probado en Win 10

Zimba
fuente
-3

usar ftp:

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

Cambie todo en asteriscos para adaptarlo a su situación.

Kirill Shilov
fuente
Seguramente depende del servidor que aloja el archivo para admitir FTP.
PnP
Questin está relacionado con http, no con ftp
Ben