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

Pfadvariable in Dos-namen 8.3 brechen

Frage Entwicklung Batch & Shell

Mitglied: Soidberg

Soidberg (Level 1) - Jetzt verbinden

02.04.2007, aktualisiert 04.04.2007, 7514 Aufrufe, 11 Kommentare

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
Mitglied: miniversum
03.04.2007 um 07:56 Uhr
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
Bitte warten ..
Mitglied: Soidberg
03.04.2007 um 12:23 Uhr
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
Bitte warten ..
Mitglied: miniversum
03.04.2007 um 14:11 Uhr
ja der Code war nur als Hilfe gedacht.
Mit eingebaut in Deinen code sieht das ganze dan so aus:
01.
set regfile=dynkey12.reg 
02.
set "regkey=HKEY_CURRENT_USER\Software\Testfirma\Testprogramm" 
03.
set "name=InstallPath" 
04.
<b>FOR /F "delims=" %%I in ('echo %CD%') do set "kCD=%%~sI" 
05.
set "value=\"%kCD%\""</b> 
06.
set "value=%value:\=\\%" 
07.
set "value=%value:\\"=\"%" 
08.
 
09.
echo Windows Registry Editor Version 5.00>%Regfile% 
10.
echo.>>%Regfile% 
11.
echo [%regkey%]>>%Regfile% 
12.
echo "%name%"="%value%">>%Regfile% 
13.
 
14.
::regedit /S dynkey12.reg 
15.
::del dynkey12.reg
miniversum
Bitte warten ..
Mitglied: Soidberg
03.04.2007 um 16:30 Uhr
Hy und direkt vielen lieben Dank.

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.
Bitte warten ..
Mitglied: miniversum
03.04.2007 um 18:27 Uhr
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:
01.
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert. 
02.
Sie können jetzt folgende Syntax verwenden: 
03.
 
04.
    %~I         - Expandiert %I und entfernt alle umschließenden 
05.
                  Anführungszeichen ("). 
06.
    %~fI        - Expandiert %I zu einem vollständigen Dateinamen. 
07.
    %~dI        - Erzeugt nur den Laufwerkbuchstaben von %I. 
08.
    %~pI        - Erzeugt nur den Pfad von %I. 
09.
    %~nI        - Erzeugt nur den Dateinamen von %I. 
10.
    %~xI        - Erzeugt nur die Dateierweiterung von %I. 
11.
    %~sI        - Erzeugter Pfad enthält nur kurze Dateinamen. 
12.
    %~aI        - Erzeugt die Dateiattribute von %I. 
13.
    %~tI        - Erzeugt Datum und Zeit von %I. 
14.
    %~zI        - Erzeugt die Dateigröße von %I. 
15.
    %~$PATH:I   - Durchsucht die in der PATH-Umgebungsvariablen 
16.
                  angegebenen Verzeichnisse und expandiert die erste 
17.
                  gefundene Datei %I zu dem vollständigen Dateinamen. 
18.
                  Wenn der Name der Umgebungsvariablen nicht definiert 
19.
                  ist oder diese Datei bei der Suche nicht gefunden wurde, 
20.
                  wird dieser Parameter zu einer leeren Zeichenkette 
21.
                  expandiert. 
22.
 
23.
Diese Parameter können auch miteinander kombiniert werden: 
24.
 
25.
    %~dpI       - Erzeugt den Laufwerkbuchstaben und Pfad von %I. 
26.
    %~nxI       - Erzeugt den Dateinamen und die Dateierweiterung von %I. 
27.
    %~fsI       - Expandiert %I zu einem vollständigen Namen, der nur 
28.
                  kurze Dateinamen enthält. 
29.
    %~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen 
30.
                  angegebenen Verzeichnisse nach %I und erzeugt den 
31.
                  Laufwerkbuchstaben und Pfad der ersten gefundenen Datei. 
32.
    %~ftzaI     - Expandiert %I zu einer Zeile, die der Ausgabe des DIR- 
33.
                  Befehls entspricht. 
34.
 
35.
In den angegebenen Beispielen können %I und PATH durch andere gültige 
36.
Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablen- 
37.
namen für FOR abgeschlossen. Die Verwendung von Großbuchstaben für die Namen 
38.
von Variablen, wie z.B. %I, macht diese Ausdrücke leichter lesbar und 
39.
vermeidet Verwechslungen mit den eigentlichen Parametern.
miniversum
Bitte warten ..
Mitglied: Biber
03.04.2007 um 18:51 Uhr
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:
01.
>for /f "delims=" %i in ("x:\hab ich nie angelegt\also gibts keine Unterordner\test.txt") do @echo %~nxi 
02.
test.txt 
03.
[--Nur Name oder nur Pfad oder nur Laufwerk herauslösen klappt--] 
04.
(=18:48:59  D:\temp=) 
05.
>for /f "delims=" %i in ("x:\hab ich nie angelegt\also gibts keine Unterordner\test.txt") do @echo %~spi 
06.
\hab ich nie angelegt\also gibts keine Unterordner\  
07.
[--shortnames bilden klappt nicht --]
Gruss
Biber
Bitte warten ..
Mitglied: Soidberg
03.04.2007 um 19:07 Uhr
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
Bitte warten ..
Mitglied: Biber
03.04.2007 um 19:59 Uhr
Moin Soidberg,

wenn das Ganze wirklich den Bezug auf das aktuelle Verzeichnis %CD% haben soll wie in Deinem Beispiel, dann
01.
...[ungetestete Skizze!] 
02.
Set "NeededSubDir=Testarama United 2" 
03.
 
04.
:: Unterhalb des aktuellen Verzeichnisses (%cd%) das nötige Unterverzeichnis anlegen 
05.
if not exist ".\%NeedeSubDir%" md ".\%NeededSubDir%" 
06.
 
07.
:: Aus Pfadnamen, z.B. "C:\Dokumente und Einstellungen\Default User\Desktop\Testarama United 2" den Shortname ableiten 
08.
FOR /F "delims=" %%I in ("%CD%\%NeedeSubDir%") do set "kCDwithSubDir=%%~sI" 
09.
:: im Kurznamen (der jetzt z.B "C:\DOKUME~1\DEFAUL~1\Desktop\TESTAR~1" heißen möge) alle Backslashes verdoppeln 
10.
set "value=%kCDwithSubDir:\=\\%" 
11.
....
Eigentlich sollte auch noch nach der Zeile "if not exist... md..." eine Erfolgsabfrage:
01.
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:\\"=\"%"
Bitte warten ..
Mitglied: Soidberg
03.04.2007 um 21:30 Uhr
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
Bitte warten ..
Mitglied: Biber
03.04.2007 um 22:01 Uhr
...in der Hoffnung, auch diese Kuh von Eis zu bekommen...

01.
...[ungetestete Skizze II!] 
02.
REM wie auch immer gesichert sein mag, dass das aktuelle auch das "richtige" Verzeichnis ist 
03.
Set "NeededSubDir=%cd%\data\Testarama United 2" 
04.
 
05.
:: ...Das nötige Unterverzeichnis anlegen 
06.
if not exist "%NeedeSubDir%" md "%NeededSubDir%" 
07.
 
08.
:: Aus Pfadnamen, z.B. "C:\Dokumente und Einstellungen\Default User\Desktop\data\Testarama United 2" den Shortname ableiten 
09.
FOR /F "delims=" %%I in ("%NeededSubDir%") do set "sNeededDir=%%~sI" 
10.
:: im Kurznamen (der jetzt z.B "C:\DOKUME~1\DEFAUL~1\Desktop\data\TESTAR~1" heißen möge) alle Backslashes verdoppeln 
11.
set "value=%sNeededDir:\=\\%" 
12.
REM diese miniversum-Zeile halte ich für unnötig: [set "value=%value:\\"=\"%"] 
13.
set "value=%value:\\"=\"%" 
14.
REM jetzt weiter mit Deinem Code wie oben... 
15.
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.
01.
FOR /F "delims=" %%I in ("%NeededSubDir%") do set "NeededDir=%%~sI" 
02.
:: im Kurznamen (der jetzt z.B "C:\DOKUME~1\DEFAUL~1\Desktop\data\TESTAR~1" heißen möge) alle Backslashes verdoppeln 
03.
set "%NeededDir=%NeededDir:\=\\%" 
04.
.... 
05.
... 
06.
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
Bitte warten ..
Mitglied: Soidberg
04.04.2007 um 16:12 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...