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
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: 61293

61293 (Level 1)

12.02.2008, aktualisiert 14.02.2008, 6766 Aufrufe, 14 Kommentare

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
Mitglied: bastla
13.02.2008 um 00:56 Uhr
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:
01.
@echo off & setlocal 
02.
set "Zeile=Deine Ergänzungszeile" 
03.
 
04.
set "ProgPfad=C:\Programme\DeinProg" 
05.
pushd "%ProgPfad%" 
06.
ren .ini .ini.-T- 
07.
ren standard.ini standard.ini.-T- 
08.
for %%i in (*.ini) do echo %Zeile%>>"%%i" 
09.
ren .ini.-T- .ini 
10.
ren standard.ini.-T- standard.ini 
11.
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
Bitte warten ..
Mitglied: 61293
13.02.2008 um 09:34 Uhr
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
Bitte warten ..
Mitglied: bastla
13.02.2008 um 10:02 Uhr
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:
01.
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:
01.
attrib -h *.ini 
02.
... 
03.
... 
04.
attrib +h *.ini
allerdings genügt es auch, die Schleife etwas abzuändern:
01.
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
Bitte warten ..
Mitglied: 61293
13.02.2008 um 10:56 Uhr
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:

01.
@echo off & setlocal 
02.
set "Zeile=Test;" 
03.
 
04.
set "ProgPfad=C:\Programme\Mein Prog" 
05.
pushd "%ProgPfad%" 
06.
attrib -h .ini 
07.
attrib -h standard.ini 
08.
ren .ini .ini.T 
09.
ren standard.ini standard.ini.T 
10.
rem for %%i in (*.ini) do echo %Zeile%>>"%%i" 
11.
for /f "delims=" %%i in ('dir /b /a-d *.ini') do echo %Zeile%>>"%%i" 
12.
ren .ini.T .ini 
13.
ren standard.ini.T standard.ini 
14.
attrib +h .ini 
15.
attrib +h standard.ini 
16.
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
Bitte warten ..
Mitglied: 61293
13.02.2008 um 15:15 Uhr
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
Bitte warten ..
Mitglied: 61293
14.02.2008 um 12:49 Uhr
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

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

01.
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
Bitte warten ..
Mitglied: bastla
14.02.2008 um 13:42 Uhr
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:
01.
for /f "delims=" %%i in ('findstr /v /m /c:"%Zeile%" *.ini') do echo %Zeile%>>"%%i"
Grüße
bastla
Bitte warten ..
Mitglied: bastla
14.02.2008 um 14:09 Uhr
Hallo skyball!

Hinsichtlich der vorigen Variante bin ich mir nach einem kurzen Test nicht mehr so sicher, daher als Alternative:
01.
for /f "delims=" %%i in ('dir /b /a-d *.ini') do type "%%i"|findstr /c:"%Zeile%">nul || echo %Zeile%>>"%%i"
Mit der Verknüpfung mittels "||" kannst Du erreichen, dass der folgende Befehl nur ausgeführt wird, wenn der erste Befehl einen Errorlevel > 0 geliefert hat (hier wegen "nicht gefunden"); das Gegenstück dazu ist "&&".

Grüße
bastla
Bitte warten ..
Mitglied: 61293
14.02.2008 um 14:14 Uhr
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.

01.
[Edit]: Da haben wir uns wohl überschnitten. Genau das habe ich gemeint mit "Prüfung".
Gruß,
sky
Bitte warten ..
Mitglied: 61293
14.02.2008 um 14:25 Uhr
Hallo bastla,

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

Gruß,
sky
Bitte warten ..
Mitglied: bastla
14.02.2008 um 14:30 Uhr
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
01.
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
Bitte warten ..
Mitglied: 61293
14.02.2008 um 14:39 Uhr
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 achten

Gruß,
sky
Bitte warten ..
Mitglied: bastla
14.02.2008 um 17:11 Uhr
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
Bitte warten ..
Mitglied: 61293
14.02.2008 um 17:51 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...