windows - mac - tag folders
Descarga de archivo por lotes de Windows desde una URL (18)
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?
Descargar archivos en PURE BATCH.
Mucha gente dice que es imposible, ¡pero no lo es! Escribí una función muy simple y está funcionando bien para la mayoría de las URL. Está utilizando el comando "bitsadmin" para descargar archivos que forma parte de Windows de forma predeterminada. (No es necesario descargar o instalar nada).
Sin JScript, sin VBScript, sin Powershell ... ¡solo lotes puros!
¡Disfrutar!
Aquí hay una secuencia de comandos simple que muestra cómo usar esta función.
@echo off
setlocal
:VARIABLES
rem EINSTEIN PICTURE (URL)
SET "FILE_URL=http://www.deism.com/images/Einstein_laughing.jpeg"
rem SAVE FILE WHERE THE SCRIPT IS LOCATED (DEFAULT)
SET "SAVE_TO=%~dp0"
SET "SAVE_TO=%SAVE_TO%Einstein_laughing.jpeg"
rem SAVE FILE IN CUSTOM PATH
rem SET "SAVE_TO=C:/Folder/Einstein_laughing.jpeg"
:FUNCTION_CALL
rem HERE WE CALL OUR FUNCTION (WRITTEN BELOW) THEN WE EXIT THE SCRIPT
CALL :DOWNLOAD %FILE_URL% %SAVE_TO%
ECHO.
PAUSE & EXIT /B
rem DOWNLOAD FUNCTION
:DOWNLOAD
setlocal
SET "_URL_=%1"
SET "_SAVE_TO_=%2"
ECHO.
ECHO DOWNLOADING: "%_URL_%"
ECHO SAVING TO: "%_SAVE_TO_%"
ECHO.
bitsadmin /transfer mydownloadjob /download /priority normal "%_URL_%" "%_SAVE_TO_%"
rem BITSADMIN DOWNLOAD EXAMPLE
rem bitsadmin /transfer mydownloadjob /download /priority normal http://example.com/filename.zip C:/Users/username/Downloads/filename.zip
endlocal
GOTO :EOF
Si quieres más información sobre BITSadmin ...
Descargue Wget desde aquí http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe
Luego instálalo.
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
Ajuste la URL y la ruta del archivo en la secuencia de comandos
- ¡Ejecuta el archivo y saca provecho!
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 here
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.
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)
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:
Encontré este script VB:
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
Esta pregunta tiene una muy buena respuesta here . 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
- Si no se proporciona el nombre, el archivo descargado se guardará por su propio nombre de la url.
- 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 this 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.
Esto debería funcionar. Hice lo siguiente para un proyecto de servidor de juegos. Descargará el archivo comprimido 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
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)
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.
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 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:
https://serverfault.com/questions/29707/download-file-from-vbscript
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
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"
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://.com/questions/4619088/windows-batch-file-file-download-from-a-url thistopic.html
y convertirlo a exe
usar ftp:
(ftp *yourewebsite.com*-a)
cd *directory*
get *filename.doc*
close
Cambie todo en asteriscos para adaptarse a su situación.
'' 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