48046
Goto Top

Mit Batch einen Installationspfad aus der Registry lesen und in eine Datei schreiben

Hallo Leute !


Bin in Sachen Batchprogrammierung nicht so fix, dass ich folgende Aufgabe alleine lösen könnte. Also ich möchte einen Installationspfad aus der Registry lesen, und zwar in folgendem Schlüssel:

[HKEY_CURRENT_USER\Software\Ghisler\Total Commander]
"IniFileName"=".\\wincmd.ini"
"FtpIniName"=".\\wcx_ftp.ini"
"InstallDir"="C:\\Programme\\TotalCommander"

Jetzt interessiert mich wie gesagt nur der Installationspfad. Anschließend möchte ich den soeben ausgelesenen Pfad in eine INI einfügen als 4'te Zeile. Die in der INI stehende 4'te Zeile soll dabei komplett ersetzt werden.

(4'te Zeile in der INI die überschrieben werden soll)
InstallDir=c:\totalcmd


Wäre toll, wenn jemand dafür einen Lösungsansatz hat. Das i-Tüpfelchen wäre natürlich noch, das (falls die besagte 4'te Zeile mal nicht an 4'ter Position stehen sollte, warum auch immer), diese in der INI ausfindig gemacht und dann ebenfalls ersetzt werden könnte. Demzufolge müßte in der INI also nach dem Texteil "InstallDir" gesucht werden...

Aber selbst wenn das nicht machbar sein sollte, würde mir die feste Zuordnung mit Zeile 4 auch völlig genügen.

MfG
Elmi

Content-Key: 58832

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

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: bastla
bastla 12.05.2007 um 09:17:13 Uhr
Goto Top
Hallo Elmi55 und willkommen im Forum!

Du könntest es so versuchen:
@echo off & setlocal
set "IniFile=D:\Test\Testini.ini"  
set "IniTemp=%Temp%\TestIni.tmp"  
set "Key=InstallDir="  
if not exist "%IniFile%" echo Datei %IniFile% nicht gefunden! & goto: eof  
move /y "%IniFile%" "%IniTemp%"  
for /f "tokens=2*" %%i in ('reg query "HKCU\Software\Ghisler\Total Commander" /v InstallDir') do set "Pfad=%%j"  
for /f "delims=" %%i in ('type "%IniTemp%"') do echo %%i|findstr /v "%Key%">nul && echo %%i>>"%IniFile%" || echo %Key%%Pfad%>>"%IniFile%"  
del "%IniTemp%"  
Den Pfad zur INI-Datei in Zeile 2 musst Du natürlich noch anpassen, und wenn Du die letzte Zeile weglässt, bleibt die ursprüngliche INI-Datei im Temp-Ordner bis zum nächsten Durchlauf gespeichert.

Grüße
bastla
Mitglied: 48046
48046 12.05.2007 um 11:22:48 Uhr
Goto Top
Hallo bastla !


Hey....das war aber eine sehr schnelle Antwort von Dir, danke face-smile
Also Respekt, das hätte ich auf keinen Fall so hingekriegt, versteh fast nur "Bahnhof" vom Script <grins>
Aber das geniale ist, es funktioniert soweit alles. Nur hab ich meinerseits 2 Dinge vergessen, bzw. sind mir erst jetzt beim Ausprobieren Deines Scripts bewußt geworden, sorry. Und zwar ist die INI (wincmd.ini) in die der Wert geschrieben werden soll auch abhängig vom Installationspfad des jeweiligen Benutzers. Folglich müßte (in den letzten Zeilen, also bei xcopy und attrib) der aktuelle Installationspfad (ohne natürlich den Zusatz InstallDir=) eingesetzt werden. Vielleicht eine Prozent-Variable, oder so !?

@Echo off & setlocal
Echo Bitte warten...
cd BENUTZERDEFINIERT
set "IniFile=wincmd.ini"  
set "IniTemp=%Temp%\TestIni.tmp"  
set "Key=InstallDir="  
if not exist "%IniFile%" echo Datei %IniFile% nicht gefunden! & goto: end  
move /y "%IniFile%" "%IniTemp%"  
for /f "tokens=2*" %%i in ('reg query "HKCU\Software\Ghisler\Total Commander" /v InstallDir') do set "Pfad=%%j"  
for /f "delims=" %%i in ('type "%IniTemp%"') do echo %%i|findstr /v "%Key%">nul && echo %%i>>"%IniFile%" || echo %Key%%Pfad%>>"%IniFile%"  
del "%IniTemp%"  

xcopy *.* ???Pfad??? /e /r /h /q /y
attrib +a -r -s -h ???Pfad???\*.* /D /S

exit


Zweiter vergessener Punkt ist die fünfte Zeile in der wincmd.ini
Ich liste mal bis zur Zeile 5 alles auf:
[Configuration] 
StartupScreen=0 
DirBrackets=0 
InstallDir=???Pfad???
pluginbasedir=???Pfad???\plugins 
Dieser "pluginbasedir"-Pfad muß natürlich auch mitersetzt werden, sonst funktioniert das Ganze leider nicht fehlerfrei.

Aber ich merke schon selbst, das ganze Projekt nimmt mittlerweile ungeahnte Ausmaße an. Für Deine Mithilfe möchte ich mich nochmals herzlich bedanken und habe völliges Verständnis wenn Du Dir jetzt den nachträglichen Rest nicht mehr antun willst. Wollte Dir aber dennoch hiermit mitteilen, dass Dein Script erfolgreich war was meine erste Situationsbeschreibung betrifft face-smile

Gruß
ELMI
Mitglied: Biber
Biber 12.05.2007 um 12:22:48 Uhr
Goto Top
Moin Elmi55,

auch von mir willkommen im Forum und danke für die vorbildliche Rückmeldung.

Eine Anmerkung wollte ich loswerden.
Wenn Du nicht so vertraut bist mit Batchskripting (und bastla schreibt ja schon eine relativ kompakte Form *g), dann solltest Du lieber ein paar mehr Zeilen schreiben, damit Du das Skript auch später selbst warten/anpassen kannst.

Denn die Strategie für Deine Anforderung ist noch relativ übersichtlich:
  • Du willst eine abzählbare Anzahl Zeilen ( 5 oder 6 oder so die Größenordnung) in eine Textdatei schreiben
  • alle Zeilen kannst Du einzeln definieren, alle haben eine ID, einen Key (z.B. "InstallDir")
  • und die Werte nach dem Schlüsselwort liest Du entweder aus der Registry oder der Original-Ini

---> entsprechend würde ich diese 6 Zeilen dann auch einzeln nacheinander mit "Echo InstallDir=%installDir%>>%myNewIni%" etc schreiben

Sonst kannst Du den (prima funktionierenden) bastla-Schnipsel nicht auf Dauer pflegen.

Gruss
Biber
Mitglied: 48046
48046 13.05.2007 um 16:39:24 Uhr
Goto Top
Hallo Biber !

Ja hast schon Recht, mit Pflegen des Scripts wäre es in Zukunft natürlich schlecht bestellt. Aber das Gute ist, ich brauche es (wenns einmal komplett steht) nie mehr zu verändern/warten.

Ich habs jetzt soweit, dass alles erledigt wird bis auf folgende 2 Einträge in der wincmd.ini

[Configuration]
StartupScreen=0
DirBrackets=0
InstallDir=???
pluginbasedir=???\plugins

Das krieg ich halt selber nicht auf die Reihe. Es betrifft also die 4'te und 5'te Zeile (Reihenfolge ändert sich nie) in der wincmd.ini und dadurch muß folglich auch kein String mehr gesucht werden, was den Programmieraufwand (hoffentlich) etwas abkürzt face-wink

Dort wo ich die ??? eingefügt habe, kommt logischerweise der aktuelle Pfad rein. Wenn man jetzt aber die kompletten Zeilen 4 und 5 austauscht, dürfte dies doch einfacher sein als wie nur an einer bestimmten Stelle der beiden Zeilen etwas zu ersetzen, oder?

Jedenfalls dachte ich mir das so, dass man 2 Variablen hat, die jeweils die ganze Zeile "InstallDir=blabla..." als auch "pluginbasedir=blabla..." repräsentieren. Somit könnte man anschließend im nächsten Schritt die Zeilen 4 und 5 komplett austauschen ohne nach bestimmten Zeichenfolgen suchen zu müssen.

Hab im Script als aktuellen Programmpfad folgende Variable (funktioniert auch):
set "Pfad=%%j"

Jetzt bräuchte ich halt nur von euch noch den Rest, um die Zeilen 4 und 5 komplett zu tauschen. Wäre schön wenn sich noch jemand findet der mir unter die Arme greift face-smile

Gruß
ELMI
Mitglied: Biber
Biber 13.05.2007 um 17:44:55 Uhr
Goto Top
Moin Elmi55,

nun denn, wenn denn jetzt die "originale" wincmd.ini nur aus dieser einen Section bestehen würde...
[Configuration] 
StartupScreen=0 
DirBrackets=0 
InstallDir=???Pfad???
pluginbasedir=???Pfad???\plugins 

... dann würde ich erst die Originaldatei sichern ..
copy /y wincmd.ini wincmd_original.ini
... mit FindStr.exe/Find.exe alles außer den Zeilen mit "InstallDir=" und "pluginbasedir=" in eine temporäre Datei schreiben:

>findstr /i /v "installDir= pluginbaseDir=" wincmd_original.ini>>myNewWinCmd.ini  
--ergibt... --
[Configuration]
StartupScreen=0
DirBrackets=0

Und an diese neue Datei zwei Zeilen anhängen:
echo InstallDir=%myInstallDir%>>myNewWinCmd.ini
echo PlugInBaseDir=%myMyBSEDir%>>myNewWinCmd.ini
::: und als letztes diese Datei über die Bestehende Wincmd.ini kopieren.
copy /y myNewWinCmd.ini WinCmd.ini

Sollte die originale WinCmd.ini mehr als diese eine Section haben, würde ich allerdings alle die Section-Zeilen mit FindStr /v entfernen...
..
set "Keys2delete=[Configuraution} StartUpScreen= DirBracket= installDir= pluginbaseDir="  
findstr /i /v "%Keys2Delete%" wincmd_original.ini>>myNewWinCmd.ini  
:: und die 5 Zeilen einzeln anfügen...
echo [Configurtion] >>myNewWinCmd.ini
echo StartUpScreen=0 1>>myNewWinCmd.ini
echo DasBrikett=0 1>>myNewWinCmd.ini
...

Gruss
Biber
Mitglied: 48046
48046 13.05.2007 um 18:02:54 Uhr
Goto Top
Danke Biber für die schnelle Antwort face-smile


Stimmt, leider hat die wincmd.ini viele Sektionen.

Aber das klappt schon gut mit Deinem Vorschlag. Nur könnte man statt am Ende anfügen, das Ganze auch an den Anfang setzen?

Un
Mitglied: Biber
Biber 13.05.2007 um 20:28:22 Uhr
Goto Top
Moin Elmi55,

Nur könnte man statt am Ende anfügen, das Ganze auch an den Anfang setzen?
Das sollte keine unüberwindliche Hürde sein.
In diesem Fall dann zuerst die handgebastelten Zeilen der [Configuration]-Section schreiben...
...danach den um die "alte" Configuration-Section bereinigten Rest der Originaldatei...

Oder im ganzen Satz:
....
Set installDir = ,,,,,, (wie auch immer ermittelt)
Set BSEDir=......(wie auch immer ermittelt)
REM zuerst die Section [Configuration] komplett neu schreiben
(echo [Configuration] 
echo StartupScreen=0 
echo DirBrackets=0 
echo InstallDir=%InstallDir%
echo pluginbasedir=%BSEDir% )>myNewWinCmd.ini
set "Keys2delete=[Configuration} StartUpScreen= DirBracket= installDir= pluginbaseDir="  
findstr /i /v "%Keys2Delete%" wincmd.ini>>myNewWinCmd.ini  
REM ...und dann die neue komplette myNewWinCmd.ini über die bisherige WinCmd.ini kopieren.
...
[ungetestete Skizze]

Gruss
Biber
Mitglied: 48046
48046 14.05.2007 um 16:35:12 Uhr
Goto Top
Hey Supi, es läuft jetzt alles so wie ich es wollte face-smile

Möchte Euch beiden, Bastla & Biber herzlichst für eure ausdauernde Geduld danken. Denn eins ist klar, alleine hätt ich es nicht hinbekommen. Dachte sowieso, dass man mit Batch recht wenig machen kann gegenüber einer richtigen Programmiersprache. Das ist zwar im Grunde wohl auch so, aber die vielen neuen Befehle die ich hier im Forum gesehen habe, erstaunten mich doch sehr.


P.S. Vielleicht war es ja für euch easy! - Aber für mich, der von Batch-Scripting maximal die Grundkenntnisse weiss, war's schweißtreibend.... <grins>

Naja, und nichts ist umsonst, hab dabei das ein oder andere dazu gelernt.

cu ihr beiden


Gruß
ELMI face-smile