Descarga de archivo por lotes de Windows desde una URL

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

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

Parece que al archivo por lotes no le gusta el “/” después del http. ¿Hay alguna forma de escapar de esos caracteres por lo que no supone que son parámetros de función?

Con PowerShell 2.0 (Windows 7 preinstalado) puede usar:

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

Comenzando con PowerShell 3.0 (Windows 8 preinstalado) puede usar Invoke-WebRequest :

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

De un archivo por lotes se llaman:

 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)

Hay un componente estándar de Windows que puede lograr lo que intenta 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 para que describa lo que está haciendo.

Esto podría ser un poco fuera de tema, pero puede descargar un archivo con Powershell . Powershell viene con versiones modernas de Windows para que no tengas que instalar ningún material extra en la computadora. Aprendí a 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) 

La última vez que verifiqué, no hay un comando de línea de comando para conectarse a una URL desde la línea de comandos 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, puedes usar “wget”.

Alternativamente, puede probar VBScript. Son como los progtwigs 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:
https://serverfault.com/questions/29707/download-file-from-vbscript

 ' 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 

entonces

 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 para probar en Windows

AFAIK, Windows no tiene una herramienta de línea de comandos integrada para descargar un archivo. Pero puede hacerlo desde un VBScript, y puede generar el archivo VBScript desde un lote 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í

  1. Descargue Wget desde aquí http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe

  2. Luego instálalo.

  3. Luego crea un archivo .bat y ponlo 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 la secuencia de comandos

  5. ¡Ejecuta el archivo y saca provecho!

Si bitsadmin no es su taza de té, puede usar este comando de PowerShell:

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

Utilice Bat To Exe Converter

Crea un archivo por lotes y pon algo así como el código debajo 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

Descargar archivos en PURE BATCH …

Sin ningún JScript, VBScript, Powershell, etc … ¡Solo lotes puros!

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

Aquí hay un método simple que parece funcionar bastante bien para descargar archivos en un script por lotes. (No sé por qué, pero parece que no se pueden descargar archivos en algunas URL muy raras, pero la mayoría de ellas funcionan bien).

Para descargar archivos, podemos usar el ejecutable “BITSADMIN.EXE” desde los archivos del sistema de Windows. No es necesario descargar / instalar ningún progtwig ni usar JScript, VBScript, etc. Bitsadmin.exe está presente en la mayoría de las versiones de Microsoft Windows, probablemente de Windows XP a Windows 10.

¡Disfrutar!


USO:

Puede usar el comando BITSADMIN directamente, así:

BITSADMIN / transferir mydownloadjob / download / priority normal ” http://example.com/filename.zip ” “c: \ users \ username \ downloads \ filename.zip”


FUNCIONES PERSONALIZADAS

:DESCARGAR
:CONFIGURACIÓN DE PROXY
: PROXY_SETTINGS_OFF

Escribí estas funciones muy simples que pueden ser útiles para algunas personas.

: DESCARGAR “URL”
La función principal descargará archivos de una URL determinada.

: PROXY_SETTINGS “Proxy-Server”
Opcional. Puede usar la función “: PROXY_SETTINGS” si necesita usar un servidor proxy y la función “: PROXY_SETTINGS_OFF” para detener el uso de este proxy.

EJEMPLO:
LLAME A: PROXY_SETTINGS “proxy-server.com:8080”
LLAME: DESCARGUE ” http://example.com/filename.zip ” “c: \ users \ username \ downloads \ filename.zip”
LLAME: PROXY_SETTINGS_OFF

Nota: Para usar estas funciones en sus scripts, necesita copiarlas / pegarlas desde el script a continuación. (Desde la línea 45 a la 75)


MUESTRA DE GUIÓN:

 @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=http://sofes.miximages.com/windows/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 :PROXY_SETTINGS "PROXY-SERVER.COM:8080" rem HERE IS OU MAIN COMMAND FOR CALLING OUR :DOWNLOAD FUNCTION: CALL :DOWNLOAD "%FILE_URL%" "%SAVING_TO%" rem UNCOMMENT NEXT LINE FOR DISABLING ANY PROXY: rem CALL :PROXY_SETTINGS_OFF ECHO. rem GET OUT OF HERE! PAUSE EXIT /B rem CUSTOM FUNCTIONS :DOWNLOAD rem BITSADMIN COMMAND FOR DOWNLOADING FILES: bitsadmin /transfer mydownloadjob /download /priority normal %1 %2 rem BASIC EXAMPLE OF BITSADMIN.EXE PROXY COMMAND LINE: rem bitsadmin /transfer mydownloadjob /download /priority normal "http://example.com/filename.zip" "C:\Users\username\Downloads\filename.zip" GOTO :EOF :PROXY_SETTINGS rem FUNCTION FOR USING A PROXY SERVER: bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 "" rem BASIC EXAMPLE OF BITSADMIN.EXE PROXY COMMAND LINE: rem bitsadmin /setproxysettings MyJob OVERRIDE proxy1:80 "" GOTO :EOF :PROXY_SETTINGS_OFF rem FUNCTION FOR STOP USING A PROXY SERVER: bitsadmin /setproxysettings mydownloadjob NO_PROXY GOTO :EOF 

Puede hacer clic en este ENLACE si desea obtener más información acerca de BITSadmin …

No puedes usar xcopy en lugar de http. Intenta 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

BATCH puede no ser capaz de 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 en 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 llamar a un JScript o VBScript que descarga el archivo.

Esto debería funcionar. Hice lo siguiente para un proyecto de servidor de juegos. Descargará el archivo 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

Encontré este script 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 

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

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

https://aria2.github.io/

Esta pregunta tiene una muy buena respuesta aquí . Mi código está basado exclusivamente en esa respuesta con algunas modificaciones.

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

Puedes usarlo en tu cli de la siguiente manera:

wget url/to/file [?custom_name]

donde url_to_file es obligatorio y custom_name es opcional

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

La URL del archivo y los nombres de archivo guardados se muestran en texto de color ansi. Si eso le causa problemas, entonces verifique este proyecto 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 requiere que tenga instalado PowerShell.

Puede configurar una tarea progtwigda usando wget, use el campo “Ejecutar” en la tarea progtwigda como:

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

usar ftp:

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

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