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.