madej1
Goto Top

Zeilen auslesen mit BatchProgramm

Wie kann ich mit einem Batch Programm Zeilen auslesen, ohne das der Zeilenumbruch kommt? Und Durch den Zeilenumbruch wo angegeben wird kann ich kein Pfad setzten, weil es dann immer [3] \\server07/1 wird... .
In der Text Datei, welche ausgelsen werden sollen stehen verschiedene Pfade.

So sieht mein Befehl zum auslesen aus:
FOR /F %%i in ('find/n "1" E:\*\Quellpfade.txt') do set Quellpfad=%%i

Die Text Datei schaut so aus:

[Quellpfade]
[1.Quelle]
\\server07\1
[2. Quelle]
\\server07\2
[3. Quelle]
\\server07\3
[4. Quelle]
\\server07\4
[5. Quelle]
\\server07\5

Würde mich über Hilfe sehr freuen

Content-Key: 74075

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

Printed on: April 16, 2024 at 07:04 o'clock

Member: Biber
Biber Nov 21, 2007 at 09:44:58 (UTC)
Goto Top
Moin Madej1,

willkommen im Forum.

Hier passen Dateiformat und Werkzeug nicht wirklich gut zusammen.

Mit Batch-Mitteln lassen sich einzelne Zeilen relativ gut verarbeiten im Sinne von "im ersten Schritt die richtige Zeile aus einer Textdatei extrahieren, im zweiten Schritt den Inhalt dieser Zeile auswerten".

Nicht zu gut geeignet ist Batch für baumartig strukturierte Textdateien wie zum Beispiel die für M$ so typische Ini-Datei-Struktur mit [Sections] und "Entry=value"-Zeilen.

Deine Textdatei-Auswertung ist zwar mit ein paar ineinandergeschraubten FOR-Anweisungen machbar, aber nur unter sehr, sehr wackligen Grundannahmen:
  • der [Section]-Text muss ganz exakt geschrieben sein also nicht wie im Beispiel mal "1. Quelle" und mal "2(Leerzeichen).Quelle"
  • es dürfen keine Leer-/Komentarzeilen drin sein- der Eintrag ("\\server..") muss unmittelbar auf die [Section]-Zeile folgen..

an diesem Punkt habe ich die handwerkliche Umsetzung beiseite gelegt.

Meine Frage vor weiteren Aktivitäten:
  • ist das Format der "Quellpfade-Datei" zwingend vorgegeben oder kannst Du es bestimmen?
  • wenn zwingend vorgegeben: kannst/darfst Du auch VBSkript und/oder Utilities (einen INI-File-Leser z.B.) einsetzen.
  • im allerallerallerdümmsten Fall (Format fest vorgegeben UND nur native Batch möglich): kannst Du sicherstellen, dass in der Quellpfade-Datei nur so restriktiv eingegeben wird wie oben skizziert?

Grüße
Biber
Member: ahe
ahe Nov 21, 2007 at 09:52:18 (UTC)
Goto Top
Hallo Madej1,

eines der ewähnten Ini-Tools kann man hier http://home.mnet-online.de/horst.muc/wbat32d.htm#inifile
finden.

Es ist relativ einfach in eine Batch zu integrieren...

mfg
Axel
Member: Madej1
Madej1 Nov 21, 2007 at 10:19:07 (UTC)
Goto Top
Danke erst mal für eure Interesse. Also es ist so das Format der "Quellpfade-Datei" sollte eine .ini sein. Und ich kann sicherstellen das dann nur so eingegeben wird wie oben skizziert sollte, aber noch übersichtlich bleiben face-confused. Und ich darf kein VBSkript machen oder utilities nehmen ... face-sad.

@ahe danke für deine mühe, aber darf es leider nicht benutzen.

Gruß Madej
Member: ahe
ahe Nov 21, 2007 at 10:31:45 (UTC)
Goto Top
Mmh,

freie Tools dürfen also nicht verwendet werden? Ich denke dann auch Tools aus den M$ ResourceKits auch nicht (kosten ja z. T. auch etwas...) oder die Support Tools von M$... oder?

Wo fangen denn bei der Definition die Utilities an, dürfen nur betriebssystemeigene "Utilities" verwendet werden? Und wenn ja, von welchem Betriebssystem bzw. von welchem ServicePack-Level sprechen wir dann?


mfg
Axel
Member: Madej1
Madej1 Nov 21, 2007 at 10:37:52 (UTC)
Goto Top
Also so Utilities von M$ aus dem ResourceKit, könnte ich benutzen, aber dann sollte das Utilitie kostenfrei ... also betriebseigene. Also von Von Xp Prof sp2. Ich bin grad total ratlos und krieg des net hin ^^ face-sad

Gruß Madej
Member: ahe
ahe Nov 21, 2007 at 11:14:32 (UTC)
Goto Top
Hallo Madej,

nur die Ruhe... face-smile

Kannst Du etwas zu Biber's Fragen sagen? Ich glaube er hatte da schon eine Idee...

mfg
Axel
Member: Biber
Biber Nov 21, 2007 at 11:57:36 (UTC)
Goto Top
Na ja,

wie bekannt ist, geht ja alles außer Brotschneiden mit Batch...

Meine Strategie wäre, wenn denn wirklich alle ungünstigen Randbedingungen von oben zusammentreffen, zuerst diese -ich nenne es mal Ini-Datei- in eine Form zu bringen, mit der ich etwas anfangen kann.

Wenn das also die "Ini-Datei" namens %temp%\Quellpfade.txt wäre ....
[Quellpfade]
[1. Quelle]
\\server07\1
[2. Quelle]
\\server07\2
[3. Quelle]
\\server07\3
[4. Quelle]
\\server07\4
[5. Quelle]
\\server07\5

...dann würde ich mit diesem aufgemotzten Einzeiler namens ini2tmp.bat...
::----snipp ini2tmp.bat 
@echo off & setlocal
Set "q=%Temp%\quellpfade.txt"  
@for /L %%a in (1,1,5) do (
  for /f "delims=: tokens=1,2" %%i in ('findstr /n $ "%q%"^|findstr ":[%%a"') do @(  
   for /f %%x in ('set /a %%i+1') do @(  
      For /f "tokens=1,* delims=:" %%y in ('findstr /n $ "%q%"^|findstr "%%x:"') do @echo %%j[%%z]  
)))

diese Zeilen erzeugen (Bsp. am CMD-Prompt):
>ini2tmp
[1. Quelle][\\server07\1]
[2. Quelle][\\server07\2]
[3. Quelle][\\server07\3]
[4. Quelle][\\server07\4]

Diese Struktur wiederum kann ich schmerzfrei nach whatever durchsuchen.
Also meinetwegen in eine Datei "%temp%\QuellpfadePlattgeklopft.txt" umleiten mit
ini2tmp >"%temp%\QuellpfadePlattgeklopft.txt"

und auf diese Datei dann mit Find [einenbestimmtenSuchtext] und nach Tokens, die mit "][" als Delimiter getrennt sind unterscheiden.

Grüße
Biber

P.S. Das soll jetzt die Strategie-Skizze sein, kein in sich geschlossener Batch.
Member: Madej1
Madej1 Nov 21, 2007 at 11:57:38 (UTC)
Goto Top
Danke für deine schnelle Antwort ich werde deinen Beitrag jetzt erstmal nochmal in ruhe durchlesen und dann versuchen face-smile. Ich geb dann eine Rückmeldung.

Gruß Madej

p.s. Finde dass das Forum hier das beste ist, wo es gibt!

edit:
danke für eure Hilfe hab es geschafft.
Member: miniversum
miniversum Nov 21, 2007 at 17:10:45 (UTC)
Goto Top
Wenn die Datei wirklich immer so aussieht:
[Quellpfade]
[1. Quelle]
\\server07\1
[2. Quelle]
\\server07\2
[3. Quelle]
\\server07\3
[4. Quelle]
\\server07\4
[5. Quelle]
\\server07\5
könnte man das ganze dann nicht einfach so auslesen?
@echo off
set "zufinden=3. Quelle"  
set "quelldatei=Quellpfade.txt"  

set "line="  
FOR /F "delims=][" %%i in ('find /N "[%zufinden%]" "quelldatei"') do if not defined line set line=%%i  
set "wert="  
FOR /F "skip=%line% delims=" %%i in ('"quelldatei"') do if not defined wert set wert=%%i  

echo %zufinden% ist %wert%

miniversum
Member: Biber
Biber Nov 21, 2007 at 17:52:50 (UTC)
Goto Top
@miniversum

Ja, Deine Lösung ist natürlich weniger verschraubt (oder verschroben?) als mein Ansatz.

Würde ich eher einsetzen als das von mir gepostete Konstrukt.

Nur (so fing ja die ganze Diskussion an):
Die Mimik, eine Ini-Datei nach einem Section-Namen zu durchsuchen und dann blind die erste Zeile zu verwerten..... hey, was nützen mir bei solchen va-banque-Aktionen irgendwelche kunstvoll programmierten Algorithmen??

Das kann aus meiner Sicht nicht sichergestellt werden, dass jeder, der vielleicht mal in der der Inidatei eine neue Quelle einpflegen muss, auch KEINE Kommentarzeilen einfügt oder keine auskommentierten stehen lässt.
Und das ist ja auch bestimmt nichts, was ich als Admin unterstütze - dass in Textdateien keine Möglichkeit gegeben ist, wenigsten neben den programmlesbaren Infos auch menschenlesbare Kommentare unterzubringen.

Vor diesenm Hintergrund meine Frage vorhin nach dem Inidatei-Leser.
Denn wenn schon, dann sollte der Algorithmus sein:
- Suche nach Section {suchSection}
- wenn nicht vorhanden --> Fehlerbehandlung oder Defaultwert annehmen
- sonst: suche innerhalb der Section {suchSection} nach Key={Suchkey}
- wenn gefunden: lese das value nach dem Gleichheitszeichen
- sonst --> Fehlerbehandlung oder Defaultwert annehmen

Und wenn bzw. solange ich nichts habe, was mir eine solche Struktur ausliest, solange würde ich für Batch-Verarbeitung eine Strategie "alle zusammengehörigen Infos in einer Zeile halten" anstreben.

Grüße
Biber
Member: Madej1
Madej1 Nov 23, 2007 at 15:05:04 (UTC)
Goto Top
Hab nochmal ne frage. Wie kann ich mit einem Batch-Programm eine text datei die zeien zählen, bzw , wenn di eanzah unbekannt ist. Es können auch mal 20 Zeilen sein oder 70 Zeilen. Diese muss ich dann auch noch einlesen und einer Variablen zuteilen?

Gruß Madej
Member: Biber
Biber Nov 23, 2007 at 16:32:17 (UTC)
Goto Top
Moin Madej1,

eine der Möglichkeiten wäre im Batch folgende FOR/F-Anweisung:

.....
FOR /F "delims=:" %%i in ('findstr /n $ "%dieTextDatei%"') do set linesCount=%%i  

Danach steht in der Variablen %LinesCount% die Anzahl Zeilen.

Ist denn der eigentliche Anlass Deines Beitrags inzwischen beantwortet oder klemmt es noch irgendwo?

Grüße
Biber
Member: Madej1
Madej1 Nov 26, 2007 at 06:56:20 (UTC)
Goto Top
Ja danke für die ganze Hilfe. Bis jetzt hab ich keine weiteren Fragen.

Gruß MAdej
Member: Biber
Biber Nov 26, 2007 at 07:03:16 (UTC)
Goto Top
Moin Madej,

dann mach ich hier erstmal dicht.

Angenehme Woche und Danke für die Rückmeldung.
Biber