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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74075
Url: https://administrator.de/contentid/74075
Ausgedruckt am: 20.11.2024 um 10:11 Uhr
14 Kommentare
Neuester Kommentar
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:
an diesem Punkt habe ich die handwerkliche Umsetzung beiseite gelegt.
Meine Frage vor weiteren Aktivitäten:
Grüße
Biber
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
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
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
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
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
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 ....
...dann würde ich mit diesem aufgemotzten Einzeiler namens ini2tmp.bat...
diese Zeilen erzeugen (Bsp. am CMD-Prompt):
Diese Struktur wiederum kann ich schmerzfrei nach whatever durchsuchen.
Also meinetwegen in eine Datei "%temp%\QuellpfadePlattgeklopft.txt" umleiten mit
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.
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.
Wenn die Datei wirklich immer so aussieht:
könnte man das ganze dann nicht einfach so auslesen?
miniversum
[Quellpfade]
[1. Quelle]
\\server07\1
[2. Quelle]
\\server07\2
[3. Quelle]
\\server07\3
[4. Quelle]
\\server07\4
[5. Quelle]
\\server07\5
@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
@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
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
Moin Madej1,
eine der Möglichkeiten wäre im Batch folgende FOR/F-Anweisung:
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
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