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-ID: 592759

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

magicteddy
Lösung magicteddy 01.08.2020 um 21:08:04 Uhr
Goto Top
Moin,

installier wget. wget bei Heise

-teddy
rubberman
Lösung rubberman 02.08.2020 um 15:40:50 Uhr
Goto Top
Windows 10 hat curl an Bord.

Steffen
joehuaba
Lösung joehuaba 03.08.2020 aktualisiert um 10:54:59 Uhr
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
MrCount
Lösung MrCount 03.08.2020 um 13:40:31 Uhr
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.
colinardo
Lösung colinardo 05.08.2020 aktualisiert um 12:38:40 Uhr
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
138701
Lösung 138701 06.08.2020 um 19:07:04 Uhr
Goto Top
Oder wie @rubberman schon erwähnte:

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