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

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

Frage Entwicklung Batch & Shell

Mitglied: 48046

48046 (Level 1)

12.05.2007, aktualisiert 14.05.2007, 6802 Aufrufe, 8 Kommentare

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
Mitglied: bastla
12.05.2007 um 09:17 Uhr
Hallo Elmi55 und willkommen im Forum!

Du könntest es so versuchen:
01.
@echo off & setlocal 
02.
set "IniFile=D:\Test\Testini.ini" 
03.
set "IniTemp=%Temp%\TestIni.tmp" 
04.
set "Key=InstallDir=" 
05.
if not exist "%IniFile%" echo Datei %IniFile% nicht gefunden! & goto: eof 
06.
move /y "%IniFile%" "%IniTemp%" 
07.
for /f "tokens=2*" %%i in ('reg query "HKCU\Software\Ghisler\Total Commander" /v InstallDir') do set "Pfad=%%j" 
08.
for /f "delims=" %%i in ('type "%IniTemp%"') do echo %%i|findstr /v "%Key%">nul && echo %%i>>"%IniFile%" || echo %Key%%Pfad%>>"%IniFile%" 
09.
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
Bitte warten ..
Mitglied: 48046
12.05.2007 um 11:22 Uhr
Hallo bastla !


Hey....das war aber eine sehr schnelle Antwort von Dir, danke
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 !?

01.
@Echo off & setlocal 
02.
Echo Bitte warten... 
03.
cd BENUTZERDEFINIERT 
04.
set "IniFile=wincmd.ini" 
05.
set "IniTemp=%Temp%\TestIni.tmp" 
06.
set "Key=InstallDir=" 
07.
if not exist "%IniFile%" echo Datei %IniFile% nicht gefunden! & goto: end 
08.
move /y "%IniFile%" "%IniTemp%" 
09.
for /f "tokens=2*" %%i in ('reg query "HKCU\Software\Ghisler\Total Commander" /v InstallDir') do set "Pfad=%%j" 
10.
for /f "delims=" %%i in ('type "%IniTemp%"') do echo %%i|findstr /v "%Key%">nul && echo %%i>>"%IniFile%" || echo %Key%%Pfad%>>"%IniFile%" 
11.
del "%IniTemp%" 
12.
 
13.
xcopy *.* ???Pfad??? /e /r /h /q /y 
14.
attrib +a -r -s -h ???Pfad???\*.* /D /S 
15.
 
16.
exit

Zweiter vergessener Punkt ist die fünfte Zeile in der wincmd.ini
Ich liste mal bis zur Zeile 5 alles auf:
01.
[Configuration]  
02.
StartupScreen=0  
03.
DirBrackets=0  
04.
InstallDir=???Pfad??? 
05.
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

Gruß
ELMI
Bitte warten ..
Mitglied: Biber
12.05.2007 um 12:22 Uhr
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
Bitte warten ..
Mitglied: 48046
13.05.2007 um 16:39 Uhr
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

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

Gruß
ELMI
Bitte warten ..
Mitglied: Biber
13.05.2007 um 17:44 Uhr
Moin Elmi55,

nun denn, wenn denn jetzt die "originale" wincmd.ini nur aus dieser einen Section bestehen würde...
01.
[Configuration]  
02.
StartupScreen=0  
03.
DirBrackets=0  
04.
InstallDir=???Pfad??? 
05.
pluginbasedir=???Pfad???\plugins 
... dann würde ich erst die Originaldatei sichern ..
01.
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:

01.
>findstr /i /v "installDir= pluginbaseDir=" wincmd_original.ini>>myNewWinCmd.ini 
02.
--ergibt... -- 
03.
[Configuration] 
04.
StartupScreen=0 
05.
DirBrackets=0
Und an diese neue Datei zwei Zeilen anhängen:
01.
echo InstallDir=%myInstallDir%>>myNewWinCmd.ini 
02.
echo PlugInBaseDir=%myMyBSEDir%>>myNewWinCmd.ini 
03.
::: und als letztes diese Datei über die Bestehende Wincmd.ini kopieren. 
04.
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...
01.
.. 
02.
set "Keys2delete=[Configuraution} StartUpScreen= DirBracket= installDir= pluginbaseDir=" 
03.
findstr /i /v "%Keys2Delete%" wincmd_original.ini>>myNewWinCmd.ini 
04.
:: und die 5 Zeilen einzeln anfügen... 
05.
echo [Configurtion] >>myNewWinCmd.ini 
06.
echo StartUpScreen=0 1>>myNewWinCmd.ini 
07.
echo DasBrikett=0 1>>myNewWinCmd.ini 
08.
...
Gruss
Biber
Bitte warten ..
Mitglied: 48046
13.05.2007 um 18:02 Uhr
Danke Biber für die schnelle Antwort


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
Bitte warten ..
Mitglied: Biber
13.05.2007 um 20:28 Uhr
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:
01.
.... 
02.
Set installDir = ,,,,,, (wie auch immer ermittelt) 
03.
Set BSEDir=......(wie auch immer ermittelt) 
04.
REM zuerst die Section [Configuration] komplett neu schreiben 
05.
(echo [Configuration]  
06.
echo StartupScreen=0  
07.
echo DirBrackets=0  
08.
echo InstallDir=%InstallDir% 
09.
echo pluginbasedir=%BSEDir% )>myNewWinCmd.ini 
10.
set "Keys2delete=[Configuration} StartUpScreen= DirBracket= installDir= pluginbaseDir=" 
11.
findstr /i /v "%Keys2Delete%" wincmd.ini>>myNewWinCmd.ini 
12.
REM ...und dann die neue komplette myNewWinCmd.ini über die bisherige WinCmd.ini kopieren. 
13.
...
[ungetestete Skizze]

Gruss
Biber
Bitte warten ..
Mitglied: 48046
14.05.2007 um 16:35 Uhr
Hey Supi, es läuft jetzt alles so wie ich es wollte

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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...