nicknack
Goto Top

Batch Zeichenfolge ersetzen für Registryerstellung

Hallo bin neu und am totalen verzweifeln. Mein Chef meint das kann man doch sooo leicht lösen. Habe hier alles ähnliche schon ausprobiert und komm mit diesen Sachen nicht so klar.

Folgendes hat sich der liebe Chef ausgedacht.

Da es so viele liebe User gibt, die ab und zu die Dateien hin und her verschieben und damit Anwendungen nicht ganz korrekt laufen sollen die Anwendungen alternativ wieder neu nachgeregt werden, mit besagter CMD Datei.

-- das aktuelle Verzeichnispfad soll wo die Dateien drinliegen, temporär als Variable zwischengespeichert werden
-- dann soll die Variable dazu genutzt werden, mittels %Variable% eine Regdatei zu kreieren, wobei sich nur bestimmte Bereiche verändern, die CLSID sind davon nicht betroffen.

Für die RegDatei Erstellung sind als Zeichen notwendig "\" bzw das "@" Symbol
Sprich momentan sieht es so aus@

Echo off
Nummer 1
  • Set Verzeichnis = %~dp0
Als Ergebnis habe ich das aktuelle Verzeichnis in der Form "C:\Programme ... " Nun müsste eigentlich das eine "\" mit zweien "\\" ersetzt werden
jetzt kommt der Teil der Regdateierstellung mittels Umleitung
Nummer 2
  • echo REGEDIT4 >> %TEMP%\test.reg
  • echo >> %TEMP%\test.reg
  • echo [HKEY_LOCAL_MACHINESoftware\_test] >>%TEMP%\test.reg
jetzt kommt das Problem mit dem @ Symbol und weswegen man Doppelbackslashs braucht
Nummer 3
  • echo @="%Verzeichnis%Dateiname.Endung" >> %TEMP%\test.reg
  • echo "ThreadingModel"="Apartment" >> %TEMP%\test.reg
Nummer 4
  • regedit %TEMP%\test.reg
  • del %TEMP%\test.reg

Content-Key: 56268

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

Printed on: April 24, 2024 at 19:04 o'clock

Mitglied: 46503
46503 Apr 10, 2007 at 15:34:02 (UTC)
Goto Top
Das Betriebssystem der Rechner ist unwichtig?
Member: NickNack
NickNack Apr 10, 2007 at 15:38:28 (UTC)
Goto Top
Hm wir haben WinNt basierte Systeme. Also ab 2000 aufwärts.
Von einer BAT-Datei, die unter 98 und Konsorten laufen und wo diese %% beachtet werden müssen, nein. Gott sei Dank nicht. face-smile
Member: Biber
Biber Apr 10, 2007 at 15:42:11 (UTC)
Goto Top
Moin NickNick,

willkommen im Forum. Und sei nicht so aufgeregt. Du hast doch schon 95% beisammen.

Zu Deiner Skizze würde ich nur empfehlen zu überprüfen:
  • macht das Sinn, den zufällig gerade aktuellen Pfad %~dp0, also den Pfad, in dem die aufgerufene Batchdatei liegt, in die Registry zu schreiben? Oder war das nur ein Beispiel?
  • mache im Batch nur dort aus optischen Gründen Leerzeichen, wo sie unbedenklich sind, d.h wo es keinen Unterschied macht, ob dort ein Leerzeichen mehr oder weniger ist. Speziell ist "@ echo off" etwas anderes als "@echo off" und ein "echo >>datei.reg" ist etwas anders als ein "echo.>>datei.reg". Ein "echo hallo>>test.txt" ist etwas anderes als "echo hallo >>test.txt".
Und ein "Set var = xx" bedeutet anders als "Set var=xx".

Die eigentliche Frage, das Ersetzen aller Backslashes durch zwei Backslashes geht so:
Set Verzeichnis=%~dp0
...
Set "verzeichnis=%verzeichnis:\=\\%"  
REM Syntax: ....Set var=%variable:alt=neu%"  

Gruss Biber
Mitglied: 46503
46503 Apr 10, 2007 at 15:46:31 (UTC)
Goto Top
Ich würde den direkten Weg über REG gehen. Reg ist Bestandteil von XP Prof und läuft auch unter Windows 2000.

Reg /? in der Eingabeaufforderung bringt die Syntax.

Für das aktuelle Verzeichnis kannst du %cd% verwenden.
Member: NickNack
NickNack Apr 10, 2007 at 15:52:20 (UTC)
Goto Top
Okay ich hole mir mal kurz eine Papiertüre und ein Brecheisen. Zum hyperventilieren und das Brett vor dem Kopf wegzubekommen. ;)
So Ohm und nun Entspannung.

Also um die Sache der Sinnhaftigkeit. Wenn ich diese Frage meinen Chef stellen würde.
Ja es macht insofern Sinn weil Laufwerksbuchstaben bei USB-Sticks teilweise innerhalb der Firma nicht fix vergeben werden. Und wenn die Herren dann halt der Meinung sind ihre Daten zu verschieben und dann die Präsentation nicht läuft...

Das da Unterschiede gab wussste ich nicht, ob da nun Freizeichen dazwischen sind oder nicht. face-smile Richte ich mich an denjenigen der die meiste Ahnung hat. Sprich Du Biber. face-smile
Member: NickNack
NickNack Apr 10, 2007 at 15:57:53 (UTC)
Goto Top
Mit dem @ Symbol gibt es keine Probleme?
Muss das nicht nach dem Schema "Schlüssel" = "Wert" reingesetzt werden ?
Member: Biber
Biber Apr 10, 2007 at 16:11:44 (UTC)
Goto Top
Nein, mit dem "@" gibt es keine Probleme. Eigentlich gibt es nie Problem beim Bätscheln.
Und in diesem Forum schon gar nicht... ich würde sagen, wir chatten hier nur ein bisschen rum....

Okay, im Ernst, Dein Vorschlag:
echo @="%Verzeichnis%Dateiname.Endung" >> %TEMP% est.reg
...enthält zwischen "echo" und den Umleitungszeichen ">>" NICHTS, was irgendwie Sonderzeichen im Batch wären.
Das wird also "Echo irgendein x-beliebiger Text>>inEineDate.reg" rausgedrückt.
Und der Platzhalter @ für den Defaultwert darf OHNE Anführungszeichen bleiben.

Verbesserungswürdig bzw. immer fehlerträchtig im Batch sind die Leerzeichen vor dem ">>".
Sicherer:
echo @="%Verzeichnis%Dateiname.Endung">>%TEMP% est.reg

Und der Zieldateiname soll bestimmt als nicht "%TEMP% est.reg" sein, sondern ein "%TEMP%\test.reg".
Beim Blättern im Bereich Batch & Shell (oder über Forumssuche "batch registry") findest Du aber ein paar Vorlagen.
Bzw., da Du ja auch fertig bist, "Vergleichsmöglichkeiten". face-wink

Gruss
Biber
Member: NickNack
NickNack Apr 10, 2007 at 16:30:08 (UTC)
Goto Top
Okay das ist die feine Unterscheidung. Ich habe halt solange im Board geschaut und mir war das echt schon peinlich mich überhaupt zu melden. Waren echt schwer überhaupt zu lesen was da gemeint ist.
Und ja es sollte
echo @="%Verzeichnis%Dateiname.Endung">>%TEMP%ichbineinBackslashtest.reg
heissen
Das Board lässt aber dieses Backslash nur bedingt zu. Hat den Eintrag extra 5 mal nachgearbeitet, immer wieder wird das Zeichen rausgenommen. face-sad
Mitglied: 46503
46503 Apr 10, 2007 at 16:39:24 (UTC)
Goto Top
%Temp%\\\\\\\\\\\


Das liegt an dem ">" ohne Leerzeichen vor dem "%"-Zeichen. Der Fehler ist bereits gemeldet.
Member: Biber
Biber Apr 11, 2007 at 12:45:58 (UTC)
Goto Top
Moin NickNack,

können wir diesen Beitrag dann erstmal auf "erledigt" setzen oder sind noch Fragen offen?

Gruss
Biber
Mitglied: 46503
46503 Apr 11, 2007 at 13:18:06 (UTC)
Goto Top
'nabend Biber. face-big-smile

Ich habe keine Fragen. Ich hatte nur einen Vorschlag, aber den wollte ja niemand. :-P
Member: Biber
Biber Apr 11, 2007 at 13:42:34 (UTC)
Goto Top
@46503,

ach was, Deinen Vorschlag, doch diesen Registry-Eintrag mit "Reg Add" zu schreiben hab ich nicht überlesen.

Dann schreibe ich mal stellvertretend eine mögliche Alternative hin:
reg add HKEY_LOCAL_MACHINE\Software\_test /ve /t REG_SZ /d %~dp0Dateiname.Endung /f
reg add HKEY_LOCAL_MACHINE\Software\_test /v ThreadingModel /t REG_SZ /d Apartment /f

Besser?

Gruss Biber
[Edit] Fehlenden Backslash eingefügt, siehe hpdms Hinweis unten [/Edit]
Mitglied: 46503
46503 Apr 11, 2007 at 13:54:51 (UTC)
Goto Top
Klar doch. Warum sollte man (unnötigerweise) über temporäre Dateien gehen. face-wink

Du musst nur noch den fehlenden "\" einfügen. :-P
Member: NickNack
NickNack Apr 11, 2007 at 15:08:01 (UTC)
Goto Top
Vielen herzlichen Dank. Hat sich alles erledigt. Mein Chef ist glücklich gestellt und hat nicht schlecht geschaut über die Alternativen.

Ihr seit die besten. face-smile
Member: Biber
Biber Apr 11, 2007 at 16:20:21 (UTC)
Goto Top
@46503
Du musst nur noch den fehlenden "\" einfügen. :-P

Mitnichten :-PP.
Diese merkwürdige Redmonder Softwareklitsche muss vielleicht endlich mal den abschliessenden Backslash bei der Bereitstellung des Pfades bei %~p0 weglassen.
Selbst unter Kumpels würde man/frau das als Bug bezeichnen.

Aber Tatsache ist: unbeeindruckt von weltweiten Programmiererkonventionen und jeglichen Einflüsterungen des verbliebenen gesunden Menschenverstandes ist M$ so ...ähm......so individuell und kreativ, dass die Pfadangaben mit abschliessendem Backslash ausgeben.

Demo:
(=17:45:45  D:\temp=)
>(@echo @echo %~dp0>dp0.bat) & dp0
D:\temp\ 
Oder deutlicher:
%~d0 == Drive == "D:" (ohne abschliessenden Backslash)
%~p0 == Path == "\temp\" (mit abschliessendem Backslash)

Bedeutet: Wenn ich z.B. die gerade ausgeführte Batch als "bisherigerName_backup.extension" auf das Rootverzeichnis kopieren wollte:
copy "%0" "%~d0\%~n0_backup%~x0"      
REM ----> hier muss ich den "\" zwischen die Variablen packen 
Kopiere ich in ein Parallel-Verzeichnis auf einem anderen Laufwerk:
REM ----> hier soll ich den "\" zwischen "X:" und "%~p0" sowie %~p0 und %~n0 weglassen?????  
REM wer soll denn sowas lesen??? Man stelle sich das in einem Batch vor:
set LW=X:
Set Backupkennung=_backup
copy "%0" "%LW%%~p0%~n0%Backupkennung%%~x0"       

Also, unterm Strich: Rein formal habe ich dich die "richtige" Syntax genommen.
Aber, da gebe ich Dir Recht, es sieht einfach Shice aus.
Und da die CMD.exe mir doppelte Backslashes in Pfadangaben nicht übelnimmt, würde ich auch schreiben:
 ...REG_SZ /d %~dp0\Dateiname.Endung /f
REM ...was dann aufgelöst würde zu:
....REG_SZ /d D:\temp\\Dateiname.Endung /f

Wenn ich das allerdings in (weiter) obigem Batch gemacht hätte vor der Anweisung "Ersetze alle "\" durch "\\",
dann wäre herausgekommen:
......REG_SZ /d D:\\temp\\\\Dateiname.Endung /f

Da ich nun fest davon ausgehe, dass ich weitere potentielle Zwischenrufer hinreichend unter den Tisch gelabert habe, werde ich den Beitrag jetzt schliessen. face-big-smile

Grüße
Biber
Mitglied: 46503
46503 Apr 11, 2007 at 16:37:19 (UTC)
Goto Top
Hier wird nicht gelabert. :-P

reg add HKEY_LOCAL_MACHINESoftware\_test /ve /t REG_SZ /d %~dp0Dateiname.Endung /f
^ da fehlt ein "\"!
Member: Biber
Biber Apr 11, 2007 at 16:57:01 (UTC)
Goto Top
Ach, den Backslash meintest Du.... *sichvornKoppklatsch*

Na gut, den ergänze ich....(oben im Posting).

Schönen Abend
Biber