Bestimmte Zeile aus Textdatei in andere Textdatei mit VBS schreiben?
Ich mache gerade mit Batch einen Online Updater. Ich habe eine Datei, in der die aktuelle Online Version steht und möchte aus der 2. Zeile den Link zum Download in eine andere Datei schreiben, damit ein anderes Batch Skript diesen öffnet. Da das in Batch fast unmöglich ist, wĂŒrde ich dieses auslese-umschreibe Skript in VBS lösen.
Falls es wen interressiert, das Batch Skript hier:
echo off
set /p systemversion=<systemversion.dat
cd downloads
if exist "currentonlineversion.dat" del currentonlineversion.dat
cd..
title BatchOs Downloader
cls
echo Please move the downloaded file to the opened folder!
echo Press any key to begin the download.
pause >nul
::open.vbs öffnet den downloads Ordner::
start open.vbs
start [Downloadlink zu currentonlineversion.dat mit Version und link]
cd downloads
:waitloop
if exist "currentonlineversion.dat" goto checkforpossibleupdate
goto waitloop
:checkforpossibleupdate
set /p onlineversion=<currentonlineversion.dat
echo Checking for updates...
echo.
if not %systemversion%==%onlineversion% goto downloadupdate
Freue mich auf Antworten.
1 Antwort
BatchOs
...mal wieder einer der versucht per Batch sein eigenes "OS" zu bastelnđ
naja... Du bist Blutiger AnfĂ€nger die sei verziehen...đ€
Batch ist eine der Barbarischsten Sprachen, welche man sich antun kann. (es sei denn, man sucht eine Extremherausforderung) . Meine ganz spezielle Spielwiese: https://www.gutefrage.net/home/thema/batch-trick/neue (damit Du mal siehst welche "Verrenkungen" nötig sind um Batch einigermaĂen kontrollieren zu können)
Der VBScript-Kram ist nicht nötig. zumal VBS technisch auf dem Stand von 2009 ist und auf modernen Systemen zunehmend Probleme hat mit bestimmten Dateinamen umzugehen und einige der Scnittstellen von M$ inzwischen deaktiviert wurden...
Aber wieder zu Deiner Batch:
Eine bestimmte Zeile aus einer Datei Lesen Skip gibt an wieviel Zeilen (mit Inhalt) beim lesen ĂŒbersprungen werden: (for/f ignoriert leere Zeilen)
demo.cmd
for /f "usebackq skip=1 tokens=*" %%a in ("Datei.ext") do (
>"andere Datei.txt" echo %%~a
rem lesen nach der aktuellen Zeile beenden
goto :breakLoop
)
:breakLoop
...mit dem ganzen Datei Zwischenspeicher-Kokelores
Demo.cmd
@echo off
chcp 65001 >nul &rem UTF-8 Codepage wegen evtl Umlaute usw.
title BatchOs Downloader &rem immer am Anfang
rem kann nur 1. Zeile lesen
set /p "systemversion=" < "systemversion.dat"
rem Downloadfolder des aktuellen Nutzers
set "DownloadFolder=%UserProfile%\Downloads"
rem lösche ist eigendlich quatsch, wird beim spĂ€teren automatischen Download ohnehin ĂŒberschrieben (2>nul FehlerOutput unterdrĂŒcken)
del "%DownloadFolder%\CurrentOnlineVersion.dat" 2>nul
rem downloade "currentonlineversion.dat"
curl "http://DeineDomain.blubb/currentonlineversion.dat" -o "%DownloadFolder%\CurrentOnlineVersion.dat" 2>nul &&(
rem wenn kein Fehler
goto :read2eZeile
)||(
rem bei fehler
echo Fehler bei Download "currentonlineversion.dat"
pause
exit /b
)
:read2eZeile
rem ĂŒberspringe beim lesen der Datei eine Zeile und lies die Zeilen komplett
for /f "usebackq skip=1 tokens=*" %%a in ("%DownloadFolder%\CurrentOnlineVersion.dat") do (
set "Link=%%~a"
rem lesen nach einer Zeile beenden
goto :breakLoop
aber warum die UmstÀnde?
Mal meine Interpretation von "CurrentOnlineVersion.dat" ... damit sparst Du eine Menge einzelner Variablenzuweiserei mach ich spÀter mit einem Rutsch.
CurrentOnlineVersion.dat
OnlineVersion=6.6.0815
OnlineArchiv=https://img1.dreamies.de/img/766/b/f2wn56r4me2.jpg
OfflineArchivName=Erzesel.jpg
Disclaimer.001=Das ist die erste Zeile eines ErklÀrungsTextes
Disclaimer.002=statt eines Archivs gibts mein Foto
Disclaimer.003=andereZeile blubb und blah
OflineDemo.cmd
@echo off
chcp 65001 >nul
set "DownloadFolder=%UserProfile%\Downloads"
rem zur demo statt direkten Online lesens nur die Datei im aktuellen Ordner direkt in Variablen verwandeln.
for /f "usebackq tokens=*" %%a in ("CurrentOnlineVersion.dat") do (set "%%~a")
echo Die aktuelle OnlineVersion ist: "%OnlineVersion%"
echo Link auf das Onlinearchiv: "%OnlineArchiv%"
rem DisclaimerVariablen anzeigen:
for /f "tokens=1* delims==" %%a in ('set "Disclaimer."') do (echo %%b)
rem lass uns mal das Arcive (aka Foto) abholen
curl "%OnlineArchiv%" -o "%DownloadFolder%\%OfflineArchivName%" 2>nul
rem und mit der standardanwendung öffnen:
start "" "%DownloadFolder%\%OfflineArchivName%"
pause
direktOnlineEinlesen.cmd
@echo off
chcp 65001 >nul
set "DownloadFolder=%UserProfile%\Downloads"
rem direkten Online lesen und direkt in Variablen verwandeln.
for /f "tokens=*" %%a in ('curl "http://DeineDomain.nix.da/CurrentOnlineVersion.dat"') do (set "%%~a")
echo Die aktuelle OnlineVersion ist: "%OnlineVersion%"
echo Link auf das Onlinearchiv: "%OnlineArchiv%"
for /f "tokens=1* delims==" %%a in ('set "Disclaimer."') do (echo %%b)
curl "%OnlineArchiv%" -o "%DownloadFolder%\%OfflineArchivName%" 2>nul
start "" "%DownloadFolder%\%OfflineArchivName%"
pause
eigentlich Wurst, woher man Daten bezieht. in Batch ist der For/f-loop der Dreh- und Angelpunkt fĂŒr den gesamten Datenaustausch
ob Du daten aus einer Datei oder von einem ProgrammOutput beziehst is irrelevant...
datei mit curl direkt anzeigen:
curl "https://filesamples.com/samples/document/txt/sample3.txt"
diesen Befehl kannst Du auch in for/f verwenden (Leerzeilen werden ignoriert):
for /f "tokens=*" %%a in ('curl "https://filesamples.com/samples/document/txt/sample3.txt"') do (echo Inhalt der Zeile: "%%~a")
noch etwas zu deinem verzechniswecheln:
mit pushd "verzeichnis" und popd kannst Du einfach wieder dahin zurĂŒck, woher Du gekommen bist:
rem zum Downloadfolder des aktuellen Nutzers
pushd "%UserProfile%\downloads"
echo bin in "%cd%"
rem wieder dahin zurĂŒck, wo du zuvor warst
popd
echo bin wieder zurĂŒck: "%cd%"
und wenn Dir beim For/f-Loop das Hirn wegbrennt, weiĂt du, weshalb Powershell erfunden wurde und ab Windows 10 standardmĂ€Ăig Cmd als Console ersetzt.
Aber dass ist eine andere Geschichte...
Steck nicht mehr allzuviel Energie in Batch/Cmd . In den nĂ€chsten Jahren wird Batch möglicherweise komplett verschwinden. Microsoft hat bereits einen der wichtigsten Batchbefehle (WMIC.exe) aus den Developerversionen von Windows 11 getilgt. Damit werden tiefgreifende Systemdaten fĂŒr Batch nicht mehr direkt erreichbar... damit ist Batch im A****
Wenn Du zukunftssicher per ConsoleScript arbeiten möchtest lerne Powershell.Danke fĂŒr die ErklĂ€rung, hab vor einiger Zeit mal viel mit Batch gemacht und wollte ein Projekt fertigstellen. Danke auch fĂŒr das mit Curl, dadurch konnte ich gerade das herunterladen automatisieren, sodass man nicht manuell die Datei verschieben muss. Sehr gut erklĂ€rt.