Pfadvariable in Dos-namen 8.3 brechen
Hallo,
ich lasse mit folgendem Code Pfade über Variablen auslesen und via .reg Datei importieren.
set regfile=dynkey.reg
set "regkey=HKEY_LOCAL_MACHINE\SOFTWARE\Testprogramm"
set "name=Settings"
set "value=%APPDATA%\Programme\Toolordner\settings.ini"
set "value=%value:\=\\%"
echo Windows Registry Editor Version 5.00>%Regfile%
echo.>>%Regfile%
echo [%regkey%]>>%Regfile%
echo "%name%"="%value%">>%Regfile%
regedit /S dynkey.reg
del dynkey.reg
Manchmal kommt es vor das Pfade in der kurzen Form importiert werden müssen. Gibt es eine Möglichkeit die Pfade durch die .bat umzubrechen und dann erst in die zu importierende .reg zu schreiben?
Gruß Soidberg
ich lasse mit folgendem Code Pfade über Variablen auslesen und via .reg Datei importieren.
set regfile=dynkey.reg
set "regkey=HKEY_LOCAL_MACHINE\SOFTWARE\Testprogramm"
set "name=Settings"
set "value=%APPDATA%\Programme\Toolordner\settings.ini"
set "value=%value:\=\\%"
echo Windows Registry Editor Version 5.00>%Regfile%
echo.>>%Regfile%
echo [%regkey%]>>%Regfile%
echo "%name%"="%value%">>%Regfile%
regedit /S dynkey.reg
del dynkey.reg
Manchmal kommt es vor das Pfade in der kurzen Form importiert werden müssen. Gibt es eine Möglichkeit die Pfade durch die .bat umzubrechen und dann erst in die zu importierende .reg zu schreiben?
Gruß Soidberg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 55349
Url: https://administrator.de/contentid/55349
Ausgedruckt am: 25.11.2024 um 17:11 Uhr
11 Kommentare
Neuester Kommentar
ja der Code war nur als Hilfe gedacht.
Mit eingebaut in Deinen code sieht das ganze dan so aus:
miniversum
Mit eingebaut in Deinen code sieht das ganze dan so aus:
set regfile=dynkey12.reg
set "regkey=HKEY_CURRENT_USER\Software\Testfirma\Testprogramm"
set "name=InstallPath"
<b>FOR /F "delims=" %%I in ('echo %CD%') do set "kCD=%%~sI"
set "value=\"%kCD%\""</b>
set "value=%value:\=\\%"
set "value=%value:\\"=\"%"
echo Windows Registry Editor Version 5.00>%Regfile%
echo.>>%Regfile%
echo [%regkey%]>>%Regfile%
echo "%name%"="%value%">>%Regfile%
::regedit /S dynkey12.reg
::del dynkey12.reg
miniversum
Es geht auch mit den Unterordnern.
Geh einfach hin und weise einer Variablen das verzeichnis zu das du in kurzform haben willst:
Zur Erklärung:
Mit echo %kCD% wird ja einfach der inhalt der Variabeln %kCD% ausgegeben. Diese Ausgabe erscheint aber hiergens sondern wird von der Forschleife weiterverarbeitet.
Eine einfache For-Schleife die so aussieht:
Die müglichkeiten die du noch hast siehst du wenn du am CMD einmal for /? eingibst. Ganz an Ende findest du dann folgende Beschreibung:
miniversum
Geh einfach hin und weise einer Variablen das verzeichnis zu das du in kurzform haben willst:
set "langername=%cd%\dies ist ein langer name"
Dann wird daraus der kurze name erzeugt (der hier halt in derneuen Variablen %kCD% dann steht).Zur Erklärung:
Mit echo %kCD% wird ja einfach der inhalt der Variabeln %kCD% ausgegeben. Diese Ausgabe erscheint aber hiergens sondern wird von der Forschleife weiterverarbeitet.
Eine einfache For-Schleife die so aussieht:
FOR /F "delims=" %%I in ('echo %CD%') do echo %%I
würde dir einfach nur diese Ausgabe des echo %kCD% wieder ausgeben werden, bzw. wenn der Teil hinter dem do set "kCD=%%I" lautet der neuen Variabeln %kCD% zuweisen werden. Dadurch das da aber nicht %%I steht sondern %%~sI wird automatisch der kurze Dateiname verwendet.Die müglichkeiten die du noch hast siehst du wenn du am CMD einmal for /? eingibst. Ganz an Ende findest du dann folgende Beschreibung:
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:
%~I - Expandiert %I und entfernt alle umschließenden
Anführungszeichen (").
%~fI - Expandiert %I zu einem vollständigen Dateinamen.
%~dI - Erzeugt nur den Laufwerkbuchstaben von %I.
%~pI - Erzeugt nur den Pfad von %I.
%~nI - Erzeugt nur den Dateinamen von %I.
%~xI - Erzeugt nur die Dateierweiterung von %I.
%~sI - Erzeugter Pfad enthält nur kurze Dateinamen.
%~aI - Erzeugt die Dateiattribute von %I.
%~tI - Erzeugt Datum und Zeit von %I.
%~zI - Erzeugt die Dateigröße von %I.
%~$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
angegebenen Verzeichnisse und expandiert die erste
gefundene Datei %I zu dem vollständigen Dateinamen.
Wenn der Name der Umgebungsvariablen nicht definiert
ist oder diese Datei bei der Suche nicht gefunden wurde,
wird dieser Parameter zu einer leeren Zeichenkette
expandiert.
Diese Parameter können auch miteinander kombiniert werden:
%~dpI - Erzeugt den Laufwerkbuchstaben und Pfad von %I.
%~nxI - Erzeugt den Dateinamen und die Dateierweiterung von %I.
%~fsI - Expandiert %I zu einem vollständigen Namen, der nur
kurze Dateinamen enthält.
%~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
angegebenen Verzeichnisse nach %I und erzeugt den
Laufwerkbuchstaben und Pfad der ersten gefundenen Datei.
%~ftzaI - Expandiert %I zu einer Zeile, die der Ausgabe des DIR-
Befehls entspricht.
In den angegebenen Beispielen können %I und PATH durch andere gültige
Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablen-
namen für FOR abgeschlossen. Die Verwendung von Großbuchstaben für die Namen
von Variablen, wie z.B. %I, macht diese Ausdrücke leichter lesbar und
vermeidet Verwechslungen mit den eigentlichen Parametern.
miniversum
Nur als Fussnote zu miniversums Kommentar:
Allerdings muss der Unterordner vorher angelegt sein.
Nicht-existente Pfade werden zwar auch "zerlegt", aber es werden keine Kurznamen irgendwie per Algorithmus berechnet.
Beispiel:
Gruss
Biber
Allerdings muss der Unterordner vorher angelegt sein.
Nicht-existente Pfade werden zwar auch "zerlegt", aber es werden keine Kurznamen irgendwie per Algorithmus berechnet.
Beispiel:
>for /f "delims=" %i in ("x:\hab ich nie angelegt\also gibts keine Unterordner\test.txt") do @echo %~nxi
test.txt
[--Nur Name oder nur Pfad oder nur Laufwerk herauslösen klappt--]
(=18:48:59 D:\temp=)
>for /f "delims=" %i in ("x:\hab ich nie angelegt\also gibts keine Unterordner\test.txt") do @echo %~spi
\hab ich nie angelegt\also gibts keine Unterordner\
[--shortnames bilden klappt nicht --]
Gruss
Biber
Moin Soidberg,
wenn das Ganze wirklich den Bezug auf das aktuelle Verzeichnis %CD% haben soll wie in Deinem Beispiel, dann
Eigentlich sollte auch noch nach der Zeile "if not exist... md..." eine Erfolgsabfrage:
...denn wenn das Unterverzeichnis (warum auch immer nicht vorhanden ist, kann kein Shortname gebildet...(siehe oben).
Gruss
Biber
set "value=%value:\\"=\"%"
wenn das Ganze wirklich den Bezug auf das aktuelle Verzeichnis %CD% haben soll wie in Deinem Beispiel, dann
...[ungetestete Skizze!]
Set "NeededSubDir=Testarama United 2"
:: Unterhalb des aktuellen Verzeichnisses (%cd%) das nötige Unterverzeichnis anlegen
if not exist ".\%NeedeSubDir%" md ".\%NeededSubDir%"
:: Aus Pfadnamen, z.B. "C:\Dokumente und Einstellungen\Default User\Desktop\Testarama United 2" den Shortname ableiten
FOR /F "delims=" %%I in ("%CD%\%NeedeSubDir%") do set "kCDwithSubDir=%%~sI"
:: im Kurznamen (der jetzt z.B "C:\DOKUME~1\DEFAUL~1\Desktop\TESTAR~1" heißen möge) alle Backslashes verdoppeln
set "value=%kCDwithSubDir:\=\\%"
....
Eigentlich sollte auch noch nach der Zeile "if not exist... md..." eine Erfolgsabfrage:
IF Errorlevel 1 goto :VergissDieGanzeAktion
Gruss
Biber
set "value=%value:\\"=\"%"
...in der Hoffnung, auch diese Kuh von Eis zu bekommen...
Und natürlich würde ich mich eigentlich auf eine Variable %NeededDir%beschränken, die am Anfang den wie-auch-immer-%CD%-plus-irgendwas enthält und die dann zum Shortname bzw. Shortname-mit-doppelten-Backslashes wird.
Alternativ ginge natürlich auch die Mimik mit "das neu angelegte SubDir zum aktuellen machen", wie Du das mit [cd "%CD%\data\Testarama United 2"] machst.
Dann allerdings würde ich das Wechseln auf ein Neues und Zurückwechseln mit PushD/PopD machen.
Siehe Hilfe am CMD-Prompt ( "PushD /?" bzw. "PopD /?")
Gruss Biber
...[ungetestete Skizze II!]
REM wie auch immer gesichert sein mag, dass das aktuelle auch das "richtige" Verzeichnis ist
Set "NeededSubDir=%cd%\data\Testarama United 2"
:: ...Das nötige Unterverzeichnis anlegen
if not exist "%NeedeSubDir%" md "%NeededSubDir%"
:: Aus Pfadnamen, z.B. "C:\Dokumente und Einstellungen\Default User\Desktop\data\Testarama United 2" den Shortname ableiten
FOR /F "delims=" %%I in ("%NeededSubDir%") do set "sNeededDir=%%~sI"
:: im Kurznamen (der jetzt z.B "C:\DOKUME~1\DEFAUL~1\Desktop\data\TESTAR~1" heißen möge) alle Backslashes verdoppeln
set "value=%sNeededDir:\=\\%"
REM diese miniversum-Zeile halte ich für unnötig: [set "value=%value:\\"=\"%"]
set "value=%value:\\"=\"%"
REM jetzt weiter mit Deinem Code wie oben...
echo Windows Registry Editor .....
Und natürlich würde ich mich eigentlich auf eine Variable %NeededDir%beschränken, die am Anfang den wie-auch-immer-%CD%-plus-irgendwas enthält und die dann zum Shortname bzw. Shortname-mit-doppelten-Backslashes wird.
FOR /F "delims=" %%I in ("%NeededSubDir%") do set "NeededDir=%%~sI"
:: im Kurznamen (der jetzt z.B "C:\DOKUME~1\DEFAUL~1\Desktop\data\TESTAR~1" heißen möge) alle Backslashes verdoppeln
set "%NeededDir=%NeededDir:\=\\%"
....
...
echo "%name%"="%NeededDir%">>%Regfile%
Alternativ ginge natürlich auch die Mimik mit "das neu angelegte SubDir zum aktuellen machen", wie Du das mit [cd "%CD%\data\Testarama United 2"] machst.
Dann allerdings würde ich das Wechseln auf ein Neues und Zurückwechseln mit PushD/PopD machen.
Siehe Hilfe am CMD-Prompt ( "PushD /?" bzw. "PopD /?")
Gruss Biber