Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Aus TXT Datei Variablen auslesen. TXT Datei ändert sich aber immer wieder.

Frage Entwicklung Batch & Shell

Mitglied: Saedelaere

Saedelaere (Level 1) - Jetzt verbinden

07.08.2007, aktualisiert 08.08.2007, 5901 Aufrufe, 6 Kommentare

Hi,

so bin ganz neu hier und will gleich was wissen.

Habe mich schon seit Jahren nicht mehr mit Batch Dateien beschäftigt und sitze jetzt an einem kleinen Programm.
Mein größtes Problem dabei sind immer noch FOR Schleifen.

Folgendes habe ich gemacht:

Erzeugen einer TXT Datei

01.
 
02.
FINDSTR /I /B "title" J:\boot\grub\menu.lst >>"%pfad%\Tests\menu_titles.txt" 
03.
 
Dabei entsteht folgende TXT Datei:

01.
 
02.
title openSUSE 10.2 - 2.6.18.8-0.5 
03.
title Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 
04.
title Windows XP 
05.
 
Schön es wäre schon an dieser Stelle wenn das Wort "title" nicht mit auftauchen würde.
Aber egal mit Tokens kann ich dieses Wort ja rauskicken

Als nächstes würde ich gerne die erste Zeile ohne das Wort "title" als Variable übernehmen.
Dann die zweite Zeile und so weiter. Das Problem an der Sache ist, dass die TXT Datei nicht immer so aussehen muss. Es kann also sein, dass sie 5 Zeilen hat und in den Zeilen etwas anderes steht. Nur das Wort "title wird immer als erstes Wort in jeder Zeile auftauchen.

Mache ich folgendes

01.
 
02.
FOR /F "usebackq tokens=2-20" %%A IN ("%pfad%\Tests\menu_titles.txt") DO set var3=%%A %%B %%C %%D %%E 
03.
 
gibt

01.
 
02.
echo %var3% 
03.
 
04.
echo Windows XP 
05.
 
Logisch irgendwie, nur wie bekomme ich die ersten beiden Zeilen jeweils in eine Variable?
Hier noch die Datei menu.lst aus der ich meine TXT Datei erzeugt habe.

01.
# Modified by YaST2. Last modification on Fr Aug  3 13:11:20 CEST 2007 
02.
default 0 
03.
timeout 60 
04.
gfxmenu (hd0,8)/boot/message 
05.
 
06.
title openSUSE 10.2 - 2.6.18.8-0.5 
07.
    root (hd0,8) 
08.
    kernel /boot/vmlinuz-2.6.18.8-0.5-default root=/dev/hda9 vga=0x31a resume=/dev/hda8 splash=silent showopts 
09.
    initrd /boot/initrd-2.6.18.8-0.5-default 
10.
 
11.
title Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 
12.
    root (hd0,8) 
13.
    kernel /boot/vmlinuz-2.6.18.8-0.5-default root=/dev/hda9 vga=normal showopts ide=nodma apm=off acpi=off noresume nosmp noapic maxcpus=0 edd=off 
14.
    initrd /boot/initrd-2.6.18.8-0.5-default 
15.
 
16.
###Don't change this comment - YaST2 identifier: Original name: windows### 
17.
title Windows XP 
18.
    rootnoverify (hd0,0) 
19.
    chainloader (hd0,0)+1
Bin für jeden Hinweis dankbar.

Viele Grüße
Saedelaere
Mitglied: bastla
07.08.2007 um 01:37 Uhr
Hallo Saedelaere und willkommen im Forum1!

... nur wie bekomme ich die ersten beiden Zeilen jeweils in eine Variable?
Abgesehen davon, dass die Zwischendatei für den beschriebenen Zweck eigentlich nicht nötig wäre, ist die Frage eher anders zu stellen:

Was hast Du mit den einzelnen Variablen eigentlich vor? Benötigst Du alle einzelnen Zeilen in verschiedenen Variablen, oder soll ohnehin mit jeder Zeile das Gleiche gemacht werden, so dass ein Unterprogramm dafür ausreichen würde?

In letzterem Falle könntest Du etwa so vorgehen:
01.
@echo off & setlocal 
02.
FOR /F "tokens=1*" %%A IN ('FINDSTR /I /B "title" J:\boot\grub\menu.lst') DO set "var3=%%B" & call :ProcessLine 
03.
goto :eof 
04.
:ProcessLine 
05.
REM In %var3% steht jetzt die Zeile und kann verarbeitet werden (stellvertretend dafür ein "echo") 
06.
echo %var3% 
07.
goto :eof
Grüße
bastla

[Edit] Da nur das erste Token entfernt werden soll, auf "1*" geändert. [/Edit]
Bitte warten ..
Mitglied: Saedelaere
07.08.2007 um 12:04 Uhr
Hi bastla,


das sieht schon mal gut aus. Leider brauche ich aber jede Zeile in einer eigenen Variablen.

Hinzu kommt noch, dass ich in dieser Datei gerne etwas einfügen würde. Es gibt den Wert "timeout" und "default".

In meiner Datei timeout = 60 default = 0. Kann ich den Wert 0 und 60 mit einer Batch Datei ersetzen?

Wenn nicht ist das nicht so schlimm. Wichtiger wäre mir mein erstes Problem.


Vielen Dank für die Hilfe!

Saedelaere

edit

Also ich komme auch mit deiner Programmzeile noch nicht weiter.
Durch echo %var3% wird nur die erste Zeile angezeigt.

01.
 
02.
FOR /F "tokens=1*" %%A IN ('FINDSTR /I /B "title" J:\boot\grub\menu.lst') DO set "var3=%%B" & call :ProcessLine 
03.
goto :eof 
04.
:ProcessLine 
05.
REM In %var3% steht jetzt die Zeile und kann verarbeitet werden (stellvertretend dafür ein "echo") 
06.
echo %var3% 
07.
ping -n 8 localhost >nul 
08.
goto :EOF 
09.
 
Die Ausgabe dieser Batch ist

01.
openSUSE 10.2 - 2.6.18.8-0.5 
02.
Es folgt eine 8 sekündige pause 
03.
Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 
04.
Es folgt eine 8 sekündige pause 
05.
Windows XP
Ich will aber, dass alle drei Zeilen angezeigt werden. In meiner endgültigen Batch kommt zwar nicht dieser Ping Befehl, aber eine Abfrage mittels set /p.
Das funktioniert dann so aber nicht.
Bitte warten ..
Mitglied: bastla
07.08.2007 um 17:23 Uhr
Hallo Saedelaere!

So ganz kann ich Dir noch nicht folgen, aber wenn Du alle Zeilen in eigenen Variablen haben willst, könntest Du so vorgehen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set /a index=0 
03.
FOR /F "tokens=1*" %%A IN ('FINDSTR /I /B "title" Z:\boot\grub\menu.lst') DO call :ProcessLine "%%B" 
04.
for /L %%i in (1,1,%index%) do echo !var%%i! 
05.
goto :eof 
06.
:ProcessLine 
07.
set /a index+=1 
08.
set "var%index%=%~1" 
09.
goto :eof
Was Du dann anstelle der einfachen Ausgabe in der "for /L"-Schleife meines Beispiels mit den Variablen %var1% bis %va rindex% machen willst, müsstest Du noch genauer erklären.
Zum Ersetzen ein Hinweis: Am elegantesten lässt sich derartiges mit "sed" (Download etwa über http://www.student.northpark.edu/pemente/sed/) erledigen, wenn die zu ersetzenden Teile allerdings anscheinend jeweils alleine in einer Zeile stehen, könntest Du etwa so vorgehen:
01.
set "tList=%temp%\TempList.lst" 
02.
if exist "%tList%" del "%tList%" 
03.
for /f "delims=" %%i in (J:\boot\grub\menu.lst) do call :ProcessLine "%%i" 
04.
move "%tList%" J:\boot\grub\menu.lst 
05.
goto :eof 
06.
:ProcessLine 
07.
set "Line=%~1" 
08.
if /i %1=="default 0" set "Line=default x" 
09.
if /i %1=="timeout 60" set "Line=timeout y" 
10.
echo %Line%>>"%tList%" 
11.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Biber
07.08.2007 um 18:33 Uhr
Moin Saedelaere,

Wenn es unbedingt ein Batch sein muss:
01.
@FOR /F "tokens=1,2* delims=[] " %%A IN ('FINDSTR /I /B "title" menu.lst^|find /n "t"') do @Set "Var%%A=%%C"
Danach steht alles was Du brauchst in den Variablen %Var1%, %Var2%, ...%VarN%.

Die kannst Du wiederum mit einer "FOR /F-Anweisung"rausflöhen:
Demo am CMD-Prompt:
01.
>FOR /F "tokens=1,2* delims=[] " %A IN ('FINDSTR /I "title" menu.lst^|find /n "t"') do @Set "Var%A=%C" 
02.
>for /f "tokens=1,* delims==" %i in ('set var') do @echo %i ist %j 
03.
Var1 ist openSUSE 10.2 - 2.6.18.8-0.5 
04.
Var2 ist Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 
05.
Var3 ist Windows XP


Grüße
Biber
Bitte warten ..
Mitglied: Saedelaere
08.08.2007 um 20:40 Uhr
So erst mal tausend Dank für die professionelle Hilfe.

Habe mich mal ein wenig in Super Sed eingearbeitet. Ist ein sehr nützliches Tool.

Auch mit euren For Schleifen kann ich jetzt das machen was ich will.
Allerdings habe ich noch ein paar Probleme.

@Biber

Kannst du mir mal deine erste For Schleife erklären?

Ist es möglich festzustellen wieviele Variablen %VarN% jetzt vorliegen?

Mal angenommen ich habe eine Textdate in der X Zeilen stehen und in jeder Zeile ist ein beliebiges Zeichen. Kann ich diese X Zeilen dann auch als einzelne Variablen übernehmen?

Gerne werde ich hier meinen Code posten wenn ich fertig bin
Damit ihr auch sehen könnt, was ich aus euren Tips gemacht habe

Liebe Grüße
Saedelaere
Bitte warten ..
Mitglied: Biber
08.08.2007 um 21:13 Uhr
Moin Saedelaere,

> Kannst du mir mal deine erste For Schleife erklären?
Nur die erste? Ich hätte Dir sonst auch auch den gesamten Batch erklärt... *gg

Die ganze Zeile...
01.
@FOR /F "tokens=1,2* delims=[] " %%A IN ('FINDSTR /I /B "title" menu.lst^|find /n "t"') do @Set "Var%%A=%%C"
FOR /F-Anweisungen immer gedanklich trennen und die Schnörkel weglassen:
01.
 FOR /F ... %%A IN ('<i>irgendwasDasOutputSchreibt</i>') do <i>irgendwasOutputVerwertendes</i>
....und dann von innen ( "irgendwasDasOutputSchreibt" ) nach außen ("FOR /F ..IN xxxxxxx..DO whatever") lesen.

Also zuerst das "innen", das 'FINDSTR /I /B "title" menu.lst^|find /n "t"' lesen.
Das beginnt mit einem FINDSTR-Befehl, der nach "title" in der Datei menu.lst sucht.
Parameter: /I = Klein/Großschreibung egal ; Parameter /B: Am Zeilenanfang danach suchen

Dieser Teil ergibt z.B einen Output wie Du oben gepostet hast:
01.
>FINDSTR /I /B "title" menu.lst 
02.
title openSUSE 10.2 - 2.6.18.8-0.5 
03.
title Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 
04.
title Windows XP
-------->dieser Output wird sofort an den Find-Befehl übergeben, der jede Zeile mit einer Zeilennummer versieht.
.....^|find /n "t"' ..... (FIND sucht hier nach dem Buchstaben "t", der natürlich in jeder "title"-Zeile vorkommt.
Ergebnis:
01.
[1]title openSUSE 10.2 - 2.6.18.8-0.5 
02.
[2]title Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 
03.
[3]title Windows XP
------->das ist jetzt das Endergebnis von "innen", von "irgendwasDasOutputSchreibt".

So. Punkt. Absatz.
Jetzt "außen":
Diesen Output zerlege ich mit der FOR /F-Anweisung Zeile für Zeile
mit drei definierten Trennzeichen "[", "]" und " " (SPACE).
01.
FOR /F "tokens=1,2* delims=[] " ....
Ich behalte das 1. Token (die Zahl zwischen den Trennern "[" und "]" ) und alles nach dem 2. Token (Token 2 ist immer "title" wissen wir ja) .
01.
@FOR /F "tokens=1,2* delims=[] " %%A IN ( meinOutputSieheOben ) do @Set "Var%%A=%%C"
...und das erste Token -->%%A enthält die Ziffer und "alles nach dem zweiten Token" fange ich als %%C ein.

So, wenn Du das nach dem zweiten Lesen nachvollziehen kannst, dann versuche bitte, die von Dir noch gestellten Folgefragen selbst zu knacken.
Wenn es nicht klappt, sehen wir uns hier wieder.

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst In Batchdatei Variablen befüllen - mit Werten aus einer TXT-Datei (6)

Frage von donnyS73lb zum Thema Batch & Shell ...

Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Webentwicklung
HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Batch & Shell
Merkwürdige Zeilenformatierung in txt Datei (3)

Frage von miczar zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...