61293
Goto Top

Batch zur Ermittlung von Programmpfad, Umbenennen und Ergänzen von Dateien

Hallo Batch-Profis.

Ich habe mehrere Programme, die für interne Feldzuordnungen versteckte ini-Files in den Programmordnern verwenden. Diese Files müssen aufgrund von Programmerweiterungen von Zeit zu Zeit upgedated werden. Es gibt zwei Standardfiles, die den Programmanwendern als Grundlage dienen:
1. .ini
2. standard.ini

Diese beiden files dürfen nicht verändert werden. Alle anderen schon.

Da ich weder den Programmordner kenne, in dem das jeweilige Programm installiert ist, noch die Anzahl der weiteren ini-Dateien, die in der Folge vom Anwender selbst durch die Nutzung der Programme erstellt werden, muss das Batch-file in der lage sein den Ordner (aus der Registry) auszulesen und alle .ini's - außer den oben genannten - zu durchlaufen, zu öffnen und gemäß den aktuellen Bedingungen anzupassen.

Folgendes soll die Batch-Datei demnach tun:

1. Den Programmordner in dem das Programm installiert ist auslesen
2. Die beiden Standardfiles umbenennen in *.txt, damit diese nicht verändert werden
3. die restlichen .ini-Dateien in einer Schleife suchen, durchlaufen und jeweils am Ende der Datei einen String ergänzen.
4. Die beiden standardfiles wieder in *.ini umbenennen

Ich bin blutiger Anfänger was Batch-Dateien angeht, glaube aber daß das das richtige Medium ist um wiederkehrende, automatisierte Abläufe durchzuführen.

Vielen Dank für Eure Unterstützung.

Gruß,
sky

Content-Key: 80578

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

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

Member: bastla
bastla Feb 12, 2008 at 23:56:59 (UTC)
Goto Top
Hallo skyball und willkommen im Forum!

Zur Umsetzung Deines an sich gut beschriebenen Ablaufes fehlt für 1. noch die Angabe des entsprechenden Reg-Keys/-Values - falls Du es selbst versuchen willst: "reg query /?" (falls das BS zumindest XP ist) sollte helfen ...

Sobald der Pfad bekannt ist (ich ersetze für die Demo das Auslesen durch einen konstanten Eintrag), ginge der Rest etwa so:
@echo off & setlocal
set "Zeile=Deine Ergänzungszeile"  

set "ProgPfad=C:\Programme\DeinProg"  
pushd "%ProgPfad%"  
ren .ini .ini.-T-
ren standard.ini standard.ini.-T-
for %%i in (*.ini) do echo %Zeile%>>"%%i"  
ren .ini.-T- .ini
ren standard.ini.-T- standard.ini
popd
Da ".txt" eine doch eher gängige Erweiterung ist (und somit die Gefahr einer ev Kollision mit einer gleichnamigen Datei beim Umbenennen etwas höher wäre), habe ich für die temporäre Namensänderung den Typ ".-T-" gewählt.

"... am Ende der Datei einen String ergänzen" habe ich so interpretiert, dass der String als neue Zeile hinzugefügt werden soll - falls nicht, bitte das "Hinzufügen" genauer beschreiben ...

Grüße
bastla
Mitglied: 61293
61293 Feb 13, 2008 at 08:34:49 (UTC)
Goto Top
Hallo bastla,

vielen Dank für Deine Hilfe. Die Syntax macht mir echt zu schaffen. Ich schreibe lieber gar nicht erst, was ich an "Selbstversuchen" in den letzten Tagen so alles fabriziert habe.

Du hast alles völlig richtig interpretiert, am Ende der Dateien soll eine Zeile hinzugefügt werden. Das jeweilige Betriebssystem, auf dem die Programme installiert sind, kenne ich aber nicht. Es kann - streng genommen - von W95 bis Vista alles dabei sein. Sicher ist nur, daß es sich in jedem Falle um Windows handelt.

Ich habe Dein Beispiel mal auf meinen Rechner angepasst aber es tut sich nichts. Die Batch-Datei "zuckt" kurz auf, ohne jedoch Änderungen an den Dateien vorzunehmen. Könnte das vielleicht folgende Ursachen haben:

  • Die zu bearbeitenden .Ini-Dateien sind versteckt
  • Im Programmpfad ist ein Leerzeichen enthalten, z.B "ProgPfad=C:\Programme\Dein Prog"
  • In der Ergänzungszeile sind Sonderzeichen, z.B "Zeile=Test;"

Gibt es eigentlich eine Art von "Debugger" für Batch-Programme. Dann könnte man selbst sehen, wo es hängt.

Nachtrag: Ich selbst teste derzeit auf w2k und xp.

Gruß,
sky
Member: bastla
bastla Feb 13, 2008 at 09:02:56 (UTC)
Goto Top
Hallo skyball!

Die zu bearbeitenden .Ini-Dateien sind versteckt
Woran es in diesem Fall liegt (wegen der Angabe mit Wildcards in der "for"-Schliefe werden diese nicht gefunden) ...
Im Programmpfad ist ein Leerzeichen enthalten, z.B "ProgPfad=C:\Programme\Dein Prog"
Kein Problem, ist beim "pushd" durch die Anführungszeichen berücksichtigt.
In der Ergänzungszeile sind Sonderzeichen, z.B "Zeile=Test;"
Nicht grundsätzlich auszuschließen, aber wohl nicht der Grund.

Gibt es eigentlich eine Art von "Debugger" für Batch-Programme. Dann könnte man selbst sehen, wo es hängt.
Zum einen ist es sinnvoll, zunächst mit "Start / Ausführen... / CMD" eine Commandshell zu öffnen, da Du so besser Programmausgaben und Fehlermeldungen nachvollziehen kannst (bei Start über Doppelklick hilft zwar ein abschließendes "pause", um das sofortige Schließen des Fensters zu verhindern, aber der erste genannte Weg ist vorzuziehen).

Zusätzlich kannst Du "Statusmeldungen" mit dem "echo"-Befehl erzeugen, also an geeigneter Stelle etwa ein "echo %Variable%", um den aktuellen Inhalt einer Variablen auszugeben, oder nur ein "echo Umbenennung erfolgt" etc.

Schließlich kannst Du auf das "echo off" zu Beginn des Batches verzichten (bzw es zu Testzwecken auf "echo on" abändern), um jeden Befehl vor der Ausführung anzeigen zu lassen. In diesem Zusammenhang hilfreich ist auch eine "Umleitung" der Ausgabe in eine Datei, indem Du den Batch so startest:
Batch.bat > Log.txt
So kannst Du die Ausgaben dann in Ruhe nachlesen (allerdings landen auch alle von Dir selbst, etwa zur Benutzerinformation, erstellten Bildschirmausgaben oder die Aufforderung des "pause"-Befehles zum Drücken einer Taste in der Datei - Du musst ev Eingaben dann "blind" machen).
Zurück zu den versteckten .ini-Dateien: Mit "attrib" kannst Du diese zwar sichtbar machen bzw wieder verstecken:
attrib -h *.ini
...
...
attrib +h *.ini
allerdings genügt es auch, die Schleife etwas abzuändern:
for /f "delims=" %%i in ('dir /b /a-d *.ini') do echo %Zeile%>>"%%i"  
Durch die Verwendung des "dir"-Befehles und die zusätzliche Angabe des Schalters "/a-d" werden alle Verzeichnisinhalte mit Ausnahme von Unterverzeichnissen berücksichtigt.

Grüße
bastla
Mitglied: 61293
61293 Feb 13, 2008 at 09:56:33 (UTC)
Goto Top
Hallo bastla,

nun geht es, bis auf eine Kleinigkeit. Auch in den beiden Dateien .ini und standard.ini wird die Zeile eingefügt. Ich nehme an, daß "ren" die beiden Dateien aus dem gleichen Grund nicht umbenennt, aus dem "for" die Dateien vormals nicht gefunden hat.

Dank Deines vorangegangenen Tipps mit "attrib", konnte ich das aber selbst anpassen und die funktionierende Lösung sieht daher nun folgendermassen aus:

@echo off & setlocal
set "Zeile=Test;"  

set "ProgPfad=C:\Programme\Mein Prog"  
pushd "%ProgPfad%"  
attrib -h .ini
attrib -h standard.ini
ren .ini .ini.T
ren standard.ini standard.ini.T
rem for %%i in (*.ini) do echo %Zeile%>>"%%i"  
for /f "delims=" %%i in ('dir /b /a-d *.ini') do echo %Zeile%>>"%%i"  
ren .ini.T .ini
ren standard.ini.T standard.ini
attrib +h .ini
attrib +h standard.ini
popd

Das Auslesen des Programmpfades über "reg query" will ich nun selbst mal versuchen. Sollte ich erfolgreich sein, poste ich hier den Rest der gesamten Prozedur. Ergebnisse gehören bekanntlich ins Forum. Wenn ich scheitere, melde ich mich ganz sicher auch wieder.

Ich danke Dir vielmals für Deine Hilfe!

Gruß,
sky
Mitglied: 61293
61293 Feb 13, 2008 at 14:15:35 (UTC)
Goto Top
Nochmals hallo!

Um zu verhindern, daß bei mehrmaligem Aufruf der Datei die "Zeile" immer wieder ergänzt wird würde ich gerne vorher prüfen, ob sie schon vorhanden ist.

Kann man das direkt in der "for"-Schleife machen - z.B. for... do if not exist %Zeile% echo... - oder muss ich das separat machen?

Danke für Eure Tips - oder besser gesagt "Tipps", wie es ja neuerdings heißt.

Gruß,
sky
Mitglied: 61293
61293 Feb 14, 2008 at 11:49:37 (UTC)
Goto Top
Hallo,

habe nun mehrere Ansätze in diversen Posts gefunden und versucht, diese auf meine Anforderungen zu adaptieren. Bislang leider erfolglos. Ich bekomme die Verknüpfung von for und findstr nicht hin.

Weder

for /f "delims=" %%i in ('findstr /c:"%Zeile%" *.ini) == 0 goto 2 else goto 1  

noch

for /f "delims=" %%i in ('type *.ini ^| findstr %Zeile%') goto 2 else goto 1  

tun, was ich will.

Bin ich nah dran oder ganz weit weg? Wer weiß Rat?
Vielen Dank!

Gruß,
sky
Member: bastla
bastla Feb 14, 2008 at 12:42:16 (UTC)
Goto Top
Hallo skyball!

Der erste Ansatz wäre schon nicht schlecht, allerdings müsstest Du zum einen den Schalter "/v" verwenden, damit alle Dateien gefunden werden, welche die Zeile nicht enthalten, und zum anderen bist Du ja an den Dateinamen interessiert, daher noch "/m" - also in etwa:
for /f "delims=" %%i in ('findstr /v /m /c:"%Zeile%" *.ini') do echo %Zeile%>>"%%i"  

Grüße
bastla
Member: bastla
bastla Feb 14, 2008 at 13:09:42 (UTC)
Goto Top
Hallo skyball!

Hinsichtlich der vorigen Variante bin ich mir nach einem kurzen Test nicht mehr so sicher, daher als Alternative:

Grüße
bastla
Mitglied: 61293
61293 Feb 14, 2008 at 13:14:22 (UTC)
Goto Top
Hallo bastla,

irgendwie fehlt mir bei der Version die Prüfung, ob die Zeile bereits vorhanden ist oder nicht. Also: "Suche die Zeile in der Datei und ergänze sie, falls nicht vorhanden".

Oder ich verstehe es einfach nicht.

[Edit]: Da haben wir uns wohl überschnitten. Genau das habe ich gemeint mit "Prüfung".  

Gruß,
sky
Mitglied: 61293
61293 Feb 14, 2008 at 13:25:56 (UTC)
Goto Top
Hallo bastla,

Deine letzte Version funktioniert tadellos.
Vielen Dank für Deine neuerliche Hilfe.

Gruß,
sky
Member: bastla
bastla Feb 14, 2008 at 13:30:46 (UTC)
Goto Top
Hallo skyball!

Zur ersten Version: Die Idee war, alle Dateinamen auflisten zu lassen, in welchen %Zeile% nicht vorkommt - insoferne wäre die Prüfung erledigt und es könnte für jede gefundene Datei die Zeile hinzugefügt werden. Allerdings klappt das mit "/v" nicht wie geplant - die Erklärung dafür suche ich noch ...

Nur Dateien, welche %Zeile% enthalten, aufzulisten funktioniert allerdings mit
findstr /m /c:"%Zeile%" *.ini  
Diese Suche ließe sich dann auch noch verfeinern, indem mit "/b" und "/e" zusätzlich verlangt wird, dass sich der Suchbegriff an Beginn und Ende der Zeile befinden, und demzufolge eine ganze Zeile darstellen muss.

Grüße
bastla
Mitglied: 61293
61293 Feb 14, 2008 at 13:39:26 (UTC)
Goto Top
Hallo bastla,

liegt vielleicht daran, daß der Schalter /v zeilenbezogen, /m jedoch dateibezogen ist. Und da wir ja unsere Ausgabe nach dem Fehlen innerhalb von Dateien und nicht innerhalb von Zeilen ausgerichtet haben, geht es wohl mit /v nicht.

Nur so ein Gedanke, wenn ich mir "findstr /?" ansehe.

EDIT: Mir ist noch etwas aufgefallen: Die findstr-Funktion arbeitet CaseSensitiv, unterscheidet also zwischen Groß- und Kleinschreibung. Ich hatte beim Testen versehentlich unsere "Suchzeile" bereits in einer Datei stehen. Allerdings klein geschrieben. Beim Ausführen der Batch, in der die Suchzeile GROSS geschrieben war, wurde der Begriff daher erneut eingefügt.

Nur als Tip, für alle Hilfesuchenden wie mich, darauf zu achtenface-wink

Gruß,
sky
Member: bastla
bastla Feb 14, 2008 at 16:11:30 (UTC)
Goto Top
Hallo skyball!

... liegt vielleicht daran, daß der Schalter /v zeilenbezogen, /m jedoch dateibezogen ist.
Das war auch meine erste Überlegung (und ausführlicher habe ich mich noch nicht damit befasst) ...

Zum Thema Groß-/Kleinschreibung wäre der Schalter "/i" zu erwähnen; dass dies allerdings in diesem Fall ein Problem wäre, hatte ich nicht erwartet, da ich von der Annahme ausgegangen war, die relevante Zeile wäre erst durch den Batch eingefügt worden; dies hätte aber einen exakten Vergleich erlaubt.

Grüße
bastla
Mitglied: 61293
61293 Feb 14, 2008 at 16:51:02 (UTC)
Goto Top
Hallo bastla,


Zum Thema Groß-/Kleinschreibung wäre der Schalter "/i" zu erwähnen;
dass dies allerdings in diesem Fall ein Problem wäre, hatte ich nicht erwartet,
da ich von der Annahme ausgegangen war, die relevante Zeile wäre erst
durch den Batch eingefügt worden;
dies hätte aber einen exakten Vergleich erlaubt.

In der Regel sollte die Zeile auch noch nicht vorhanden sein aber wie überall im Leben, gibt es eben hier "Spielkinder", die in allen möglichen und unmöglichen Verzeichnissen und Dateien herumfuhrwerken, daß es einen graust und die sich hinterher wundern, daß nichts mehr funktioniert wie es soll.

In diesem Fall war aber ich der Übeltäter, weil ich die Datei unter allen Umständen testen wollte und da ist mir das eben aufgefallen.

Gruß,
sky