badbatchcoder
Goto Top

Link öffnen, bzw. Datei herunterladen per Batch

Liebes Batch-Team,

ich müsste per Batch-File eine .msi-Datei herunterladen und habe es mit zwei Befehlen versucht, jedoch funktioniert keiner wirklich so wie gewollt.
Wenn man den Link zum Download in den Browser einfügt, wird die Datei sofort heruntergeladen und der Tab danach geschlossen.
Die Datei wird also sofort heruntergeladen und es kann eigentlich nicht am Link liegen.

Als Erstes habe ich folgendes getestet:
powershell -Command "Invoke-WebRequest %link% -Outfile %name_der_heruntergeladenen_datei%" >nul  
Doch da ist einfach nichts passiert...

Danach habe ich es einfach versucht, indem ich den Link so starte:
start %link% /B
Dabei wurde aber immer ein Chrome-Tab geöffnet, egal welche Parameter ich dazu angegeben habe.
Hat dazu jemand eine Idee? Würde mich sehr über eine Antwort freuen.

Vielen Dank im Voraus
Liebe Grüße BatchCoder

Content-Key: 592759

Url: https://administrator.de/contentid/592759

Printed on: April 18, 2024 at 12:04 o'clock

Member: magicteddy
Solution magicteddy Aug 01, 2020 at 19:08:04 (UTC)
Goto Top
Moin,

installier wget. wget bei Heise

-teddy
Member: rubberman
Solution rubberman Aug 02, 2020 at 13:40:50 (UTC)
Goto Top
Windows 10 hat curl an Bord.

Steffen
Member: joehuaba
Solution joehuaba Aug 03, 2020 updated at 08:54:59 (UTC)
Goto Top
Powershell kann das, nur dass der Befehl ein wenig anders ist:
https://www.itnator.net/datei-herunterladen-mit-powershell/
Am einfachsten ist BITS face-smile

Gruß Johannes
Member: MrCount
Solution MrCount Aug 03, 2020 at 11:40:31 (UTC)
Goto Top
Servus,

ich habe mal ein Batch-Script zum Download einer Speisekarte geschrieben.... ist aber schon was älter...


@echo off
set to_download=https://speisemeister.net/tageskarte-pdf.html?tx_webkitpdf_pi1[urls]=https://speisemeister.net/tageskarte.html?type=97
set save_to=c:\users\%username%\Desktop\Tageskarte.pdf
set autoopen=0

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 "Lade '" ^& target ^& "' von '" ^& 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 "Download fehlgeschlagen: HTTP Status " ^& status  >> %DLOAD_SCRIPT%  
echo    WScript.Quit 1                                                  >> %DLOAD_SCRIPT%
echo Else                                                  				>> %DLOAD_SCRIPT%
echo    WScript.Echo "Download fertig"  								>> %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%


cscript //Nologo %DLOAD_SCRIPT% %to_download% %save_to%

del %DLOAD_SCRIPT%

if %autoopen% EQU 1 start "" %save_to%  


Vielleicht kannst du damit ja was anfangen, wenn es Batch (mit VBS) sein soll.
Member: colinardo
Solution colinardo Aug 05, 2020 updated at 10:38:40 (UTC)
Goto Top
Servus.
powershell -Command "Invoke-WebRequest %link% -Outfile %name_der_heruntergeladenen_datei%" >nul
Hochkommata sollte man hier um Datei und URL setzen wegen evt. Sonderzeichen.
powershell -EP Bypass -C "Invoke-WebRequest '%link%' -Outfile '%name_der_heruntergeladenen_datei%'"  


Wie die Kollegen schon geschrieben haben gibt es diverse Möglichkeiten eine Datei über Batch, PS &Co. herunterzuladen. Es gibt aber Fälle in denen das nicht so einfach möglich ist bzw. die Seiten die Downloads einschränken.

Auf der Seite des Downloads z.B. kann dieser etwa per JavaScript getriggert werden bzw. eine Umleitung findet per Skript statt, das bekommen die o.g. Methoden natürlich nicht gebacken da sie keine Skripte der Seite parsen. Zusätzlich kann auch eine Prüfung von Cookies gegeben sein. Manche Seiten prüfen auch den User-Agent, dann muss man den bei Invoke-Webrequest ebenfalls über den passenden Parameter anpassen!

Dann wären z.B. in der Powershell auch noch ein paar Hindernisse wie die z.B. die aktiven TLS-Versionen des ServicePointManagers der bei HTTPS Downloads den Download sonst verhindert, was sich mit
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::GetNames([System.Net.SecurityProtocolType]) 
im Skript des Downloads ändern lässt um bspw. alle bekannten TLS Versionen zu aktivieren.
Zu den oben genannten Methoden könnten auch noch diverse andere .NET Methoden zum Download genutzt werden wie z.B.
(New-Object System.Net.WebClient).DownloadFile('URL','C:\dateiname.ext')  
als Batch
powershell -EP Bypass -C "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::GetNames([System.Net.SecurityProtocolType]) ; (New-Object System.Net.WebClient).DownloadFile('URL','C:\dateiname.ext')"  

Oder auch RAW HTTPWebRequests usw.

Aber wie gesagt bringt das alles nichts wenn der Link nicht direkt die binären Daten der Datei zurückgibt oder über Redirect verlinkt. Sobald ein Skript ins Spiel kommt müsste man sich z.B. per Selenium auf die Seite schalten oder die Seite per Developer Tools im Browser mal ansehen und schauen was für POST oder GET Requests genutzt werden und den tatsächlichen Link herauszufischen. Oder man schreibt sich ein PS Skript das auch das automatisiert aus der Seite ausliest, dito mit Cookie-Handling.

Wie gesagt es gibt viele Wege nach Rom, aber es kommt wie immer auf die Bedingungen an die der Link uns vorgibt und was dann effektiv von den Tools genutzt werden kann und welches nicht.

Grüße Uwe
Mitglied: 138701
Solution 138701 Aug 06, 2020 at 17:07:04 (UTC)
Goto Top
Oder wie @rubberman schon erwähnte:

curl -o "%name_der_heruntergeladenen_datei%" "%link%" >nul 2>nul