soidberg
Goto Top

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

Content-Key: 55349

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

Printed on: April 25, 2024 at 09:04 o'clock

Member: miniversum
miniversum Apr 03, 2007 at 05:56:00 (UTC)
Goto Top
geht z.B. so:
set "dateiname=C:\ich bin ein langer.name"
FOR /F "delims=" %%I in ('echo %dateiname%') do @echo Name: %%I ; Kurzer Name: %%~sI
Alternativ geht es auch über dir /x und dort eben auslesen.

miniverum
Member: Soidberg
Soidberg Apr 03, 2007 at 10:23:39 (UTC)
Goto Top
Hy, erstmal vielen Dank für deine Hilfestellung.

Ich bekomme zwar mit dem Befehl den kurzen Namen angezeigt, allerdings wird er nicht in die .reg geschrieben.

Am Ende soll die .reg Datei so aussehen (NUR MIT KURZEM PFAD!!):
---
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Testfirma\Testprogramm]
"InstallPath"="\"C:\\Dokumente und Einstellungen\\TESTUSER\\Desktop\\TESTPROGRAMM\\data\""
---

Da es sich bei dem Testprogramm um eine Portable Anwendung handelt wird der "valuewert" immer mit %CD% gehändelt. Bei diesem Beispiel liegt das Programm auf dem Desktop.

Hier der bisherige Code:

set regfile=dynkey12.reg
set "regkey=HKEY_CURRENT_USER\Software\Testfirma\Testprogramm"
set "name=InstallPath"
set "value=\"%CD%\""
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

(import und delete habe ich jetzt mal mit :: ausgeklammert)

Da ich mich mit .bat nicht wirklich auskenne, bitte ich meine "Unwissenheit" zu entschuldigen und hoffe auf weitere Hilfe....

Wie muss der Code geändert werden damit der kurze Namen in die .reg geschrieben wird? Ich habe deinen Code (um einfach alles mal zu testen bevor ich um Hilfe rufe) einfach mal in jeder Zeile ausprobiert, es wird aber immer nur der lange Pfad geschrieben.

Liebe Grüße Soidberg
Member: miniversum
miniversum Apr 03, 2007 at 12:11:48 (UTC)
Goto Top
ja der Code war nur als Hilfe gedacht.
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
Member: Soidberg
Soidberg Apr 03, 2007 at 14:30:02 (UTC)
Goto Top
Hy und direkt vielen lieben Dank. face-smile

An meiner Antwort erkennst du das soweit alles bestens funktioniert, somit wäre das eigentliche Thema vom Tisch und ich könnte diesen Thread schließen (;) Gruß an unseren Mod) wenn mich da nicht die Frage nach dem dahinter so reizen würden.

Sicherlich würde eine komplette Erklärung den Rahmen sprengen aber könntest du mir in Bezug auf dieses Thema den Befehl mal erklären?

Was genau passiert in dieser (für mich noch) kryptischen Zeichenketten (FOR /F "delims=" %%I in ('echo %CD%') do set "kCD=%%~sI") genau?

Wieso wird zum Beispiel aus %CD% in der Zeile: set "value=\"%kCD%\"" = %kCD%?

**Wie gesagt, es funktioniert wunderbar. Ich würde es jetzt nur noch gerne verstehen.

Dankende, nette Grüße

Soidberg


EDIT:

Ich habe da doch noch ein (wahrscheinlich) kleines Problem.
Es kommt auch vor das nach der Variable %CD% (die ja jetzt gekürzt wird) weitere feste Unterordner angegeben werden. Beispiel:

%CD%\Testorama United 2 (absoluter Beispielname)

Alles innerhalb der Variable wird gekürzt, die Unterordner noch nicht, bekommen wir das auch noch hin? Ansonsten muss ich halt schauen das die Unterordner kurz genug sind und einfach nie gekürzt werden müssen.
Member: miniversum
miniversum Apr 03, 2007 at 16:27:47 (UTC)
Goto Top
Es geht auch mit den Unterordnern.
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
Member: Biber
Biber Apr 03, 2007 at 16:51:38 (UTC)
Goto Top
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:
>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
Member: Soidberg
Soidberg Apr 03, 2007 at 17:07:24 (UTC)
Goto Top
Okay,

das hat mir als Anfang zur Information gelangt. Ich habe auch schon angefangen mich weiter einzulesen, muss allerdings feststellen das ich da wohl noch etwas Zeit investieren muss.

Das ganze wirkt auf mich (so doof das auch klingen mag) noch recht komplex.

Würdest du mir bitte die Variable in folgenden Code setzen, sodas der Unterordner "Testarama United 2" mit gewandelt wird?

set regfile=dynkey12.reg
set "regkey=HKEY_CURRENT_USER\Software\Testfirma\Testprogramm"
set "name=InstallPath"
FOR /F "delims=" %%I in ('echo %CD%') do set "kCD=%%~sI"
set "value=\"%kCD%\Testarama United 2""
set "value=%value:\=\\%"
set "value=%value:\\"=\"%"

echo Windows Registry Editor Version 5.00>%Regfile%
echo.>>%Regfile%
echo [%regkey%]>>%Regfile%
echo "%name%"="%value%">>%Regfile%

Ich möchte an der Stelle auch unbedingt nochmal "Danke" sagen, soviel Gedult mit einem Anfänger ist nicht selbstverständlich. Es ist schön zu erfahren das es noch Boards gibt in denen vorbehaltslos geholfen wird.

Grüße Soidberg
Member: Biber
Biber Apr 03, 2007 at 17:59:58 (UTC)
Goto Top
Moin Soidberg,

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
...denn wenn das Unterverzeichnis (warum auch immer nicht vorhanden ist, kann kein Shortname gebildet...(siehe oben).

Gruss
Biber


set "value=%value:\\"=\"%"
Member: Soidberg
Soidberg Apr 03, 2007 at 19:30:08 (UTC)
Goto Top
Hallo Biber,

muss ich mit deinem Beispiel ähnlich aussehende Zeilen im bereits bestehenden Code ersetzen oder kommen die da noch zusätzlich rein?

Ich habe aber auch eine Lösung gefunden.... eventuell mal eine kleine Erklärung vorweg:

Bei meinem Projekt geht es um einen Loader für eine portable Anwendung. In unserem Programmordner (Portable Testarama) liegt unsere .bat (später kompiliert zu einer .exe) sowie ein "data" Ordner in dem die eigentlichen Programmdateien (Testarama.exe) sowie Unterordner (Testarama United 2) der eigentlichen Anwendung liegen.

Der Ordner "Portable Testarama" darf umbenannt werden und kann selbstverständlich überall auf dem Gastsystem liegen (also dynamische Pfade), die Ordner und Dateien im "Data" Ordner bleiben immer gleich!

Ich springe jetzt einfach mit der .bat (Loader) in die festen Unterordner im "data" Verzeichnis und nutze die bereits funktionierende Variante von miniversum.

Mein kompletter Code sieht jetzt so aus:


::Hier wird gesprungen (Beispielordner "Testarama United 2")
cd %CD%\data\Testarama United 2

:: Hier wird umgebaut :o)
set regfile=dynkey.reg
set "regkey=HKEY_CURRENT_USER\Software\Testfirma\Testprogramm"
set "name=InstallPath"
FOR /F "delims=" %%I in ('echo %CD%') do set "kCD=%%~sI"
set "value=\"%kCD%""
set "value=%value:\=\\%"
set "value=%value:\\"=\"%"

echo Windows Registry Editor Version 5.00>%Regfile%
echo.>>%Regfile%
echo [%regkey%]>>%Regfile%
echo "%name%"="%value%">>%Regfile%

:: Import der .reg Datei
::regedit /S dynkey.reg

:: Löschung der importierten Datei
del dynkey.reg

:: und wieder zurück ins Ur-Verzeichnis
cd ..
cd ..



Somit wird der dann aktuelle Pfad: ..\Portable Testarama\data\Testarama United 2 umgewandelt. :o)

**Wie war das, man darf doof sein, muss sich aber zu Helfen wissen.

Natürlich wäre es einfacher mit der Steuerung ohne zu springen. Da ich aber (wie schon geschrieben) nicht rausbekomme wie und wo ich deine Zeilen zu setzen habe, wäre ich auf einen fertigen Code von Dir angewiesen.

Grüße Soidberg
Member: Biber
Biber Apr 03, 2007 at 20:01:13 (UTC)
Goto Top
...in der Hoffnung, auch diese Kuh von Eis zu bekommen...

...[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
Member: Soidberg
Soidberg Apr 04, 2007 at 14:12:48 (UTC)
Goto Top
So, da rutsch die Kuh... ;0)

Jetzt habe auch ich es verstanden und erfolgreich umgesetzt.

Der Code lautet im ganzen:

set regfile=dynkey.reg
set "regkey=HKEY_CURRENT_USER\Software\Testfirma\Testprogramm"
set "name=InstallPath"
Set "NeededSubDir=%cd%\owndata\Testarama United 2\"
FOR /F "delims=" %%I in ("%NeededSubDir%") do set "sNeededDir=%%~sI"
set "value=\"%sNeededDir%""
set "value=%value:\=\\%"
set "value=%value:\\"=\"%"

echo Windows Registry Editor Version 5.00>%Regfile%
echo.>>%Regfile%
echo [%regkey%]>>%Regfile%
echo "%name%"="%value%">>%Regfile%

@Biber

Die Zeile: set "value=%value:\\"=\"%" stammt von mir, Sie wird benötigt um das gebrauchte Format zu erhalten. Die Reg Datei sollte so aussehen (tut Sie jetzt auch):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Testfirma\Testprogramm]
"InstallPath"="\"C:\\DOKUME~1\\USER\Desktop\\Projekt\\data\\owndata\\TESTAR~1\""

Egal wo die die portable Anwendung jetzt liegt, es wird immer das korrekte Unterverzeichnis mit gekürzt. :0)

Damit wäre das Ding erledigt und ich bedanke mich nochmal für das Brainstorming bzw. die ausdauernde Hilfestellung.

Liebe, nette Grüße

Soidberg