Bestimmte Zeile aus Textdatei in andere Textdatei mit VBS schreiben?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
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.
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
einebiene687 
Fragesteller
 28.06.2023, 21:07

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.

0