gerry56
Goto Top

Mklink mit Leerzeichen in Pfadangabe funktioniert nicht

Hallo!
Ich habe leider ein neues Problem bei der Erstellung einer Batchdatei für die Hardlinkerstellung

Ausgangssituation
Es gibt diverse Vorlagen in einem gemeinsamen Verzeichnis.
MS Office will aber diese Dateien in eigenen Verzeichnissen.
Die Lösung heißt Hardlink und funktioniert im Prinzip.

Da ich nicht jedes Mal alles neu händisch erstellen oder kopieren will, habe ich eine Batchdatei erstellt.

Der code
set "hardlinkziel="c:\apps\Microsoft Office\Office12\Macros""
set "hardlinkquelle=D:\daten\vorlagen"

:rem Unterscheidung, ob Quelle ein Verzeichnis oder eine Datei ist
set "verzdat=verzeich"

:rem Bei Variablenwert filedat wird ein Hardlink für eine Datei, und bei Variablenwert verzeich wird ein Hardlink für ein Verzeichnis erstellt.
if "%verzdat%" == "filedat" D:\hardlink\mklink /H "%hardlinkziel%" "%hardlinkquelle%"
if "%verzdat%" == "verzeich" D:\hardlink\mklink /j "%hardlinkziel%" "%hardlinkquelle%"

So lange der Verzeichnispfad keine Leerzeichen beinhaltet, funktioniert alles.
Leider gibt es Probleme, wenn der Verzeichnispfad Leerzeichen beinhaltet.
Variablenwert auslesen und Verzeichnispfad mit dem Befehl mkdir erstellen funktioniert, wenn so wie bei der Variablen hardlinkziel der VVerzeichnispfad extra in Anführungszeichen gesetzt wird.
Jedoch macht der Befehl mklink Probleme.

Ich hoffe, ihr könnt mir helfen.
Danke im voraus
Gerry

Content-ID: 1798322940

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

Ausgedruckt am: 18.11.2024 um 09:11 Uhr

rubberman
rubberman 01.02.2022 um 14:36:37 Uhr
Goto Top
Ersetze mal gedanklich deine Variablen mit dem zugewiesenen Pfad und dann überleg mal was aus Pfaden mit Anführungszeichen wird, die du an der Stelle noch mal in Anführungszeichen setzt.

Steffen
gerry56
gerry56 01.02.2022 aktualisiert um 15:11:20 Uhr
Goto Top
Wie ich schon im Eingangspost geschrieben habe, hat der Befehl mkdir keine Probleme mit den doppelten Anführungszeichen bei der Wertzuweisung.
Ich habe auch schon die Tilde versucht.
Hier die Ergebnisse.
:rem bei set "hardlinkziel="c:\apps\Microsoft Office\Office12\Macros"" und
:rem mit if "%verzdat%" == "verzeich" D:\hardlink\mklink /j "%hardlinkziel%" "%hardlinkquelle%" wird Link in c:\atest\apps\Microsoft erstellt
:rem
:rem bei set "hardlinkziel="c:\apps\Microsoft Office\Office12\Macros"" und
:rem mit if "%verzdat%" == "verzeich" D:\hardlink\mklink /j "%~hardlinkziel%" "%hardlinkquelle%"
:rem oder mit if "%verzdat%" == "verzeich" D:\hardlink\mklink /j %~hardlinkziel% "%hardlinkquelle%" bringt folgende Fehlermeldung
:rem Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %hardlinkziel%" "%~hardlinkquelle%"
:rem Geben Sie CALL /? oder FOR /? ein, um herauszufinden, welche Formate gültig sind.
:rem Syntaxfehler.

Gerry
rubberman
Lösung rubberman 01.02.2022 um 16:27:41 Uhr
Goto Top
Ich habe auch schon die Tilde versucht.
Nee, das funktioniert nur bei FOR variablen face-smile

Ich versuche es einfach noch mal zu erklären.
set "hardlinkziel="c:\apps\Microsoft Office\Office12\Macros""  
... weist der Variablen hardlinkziel den Wert ...
"c:\apps\Microsoft Office\Office12\Macros"
... zu, incl. der Anführunszeichen. In Zeile ...
if "%verzdat%" == "verzeich" D:\hardlink\mklink /j "%hardlinkziel%" "%hardlinkquelle%"  
... hast du noch einmal Anführunszeichen um die Variable gesetzt, somit ergibt das beim Expandieren der Variable ...
""c:\apps\Microsoft Office\Office12\Macros""
... mit insgesamt 4 Anführungszeichen.
Die Lösung ist einfach. Lasse sie in deiner SET Anweisung um den Pfad einfach weg.
set "hardlinkziel=c:\apps\Microsoft Office\Office12\Macros"  

Steffen
gerry56
gerry56 01.02.2022 um 21:34:00 Uhr
Goto Top
Hallo Rubberman!

Danke für den informativen Beitrag.

Ich habe nach Erhalt des Beitrages diverse Kombinationen getestet.
Daher meine späte Antwort.

1.) Daß der Trick mit der Tilde NUR bei FOR Abfragen funktioniert, wußte ich nicht. - Danke für die Info.

2.) Betreffend Tilde habe ich jedoch bemerkt, daß man in einer Bemerkungszeile :REM keine Tilde verwenden darf,
da solch eine Zeile danach NICHT MEHR als Bemerkungszeile sondern als Kommandozeile verarbeitet wird.
Ein Doppelpunkt oder 2 Doppelpunkte nützen auch nichts.

3.) Das Wichtigste, Pfadangabe in Variablen mit mklink verarbeiten.
Wenn die in einer Variablen gespeicherte Pfadangabe ein oder mehrere Leerzeichen beinhaltet, muß bei der Wertzuweisung und beim Befehl genau aufgepaßt werden.

Möglichkeit A.)
Bei der Wertzuweisung an die Variable wird der Pfad ZUSÄTZLICH in Anführungszeichen gesetzt, da der Pfad mindestens 1 Leerzeichen enthält.
In diesem Fall muß bei der Befehlsausführung die Variable OHNE Anführungszeichen aufgerufen werden.
Beispiel A.)
set "hardlinkziel="c:\apps\Microsoft Office\Macros""
set "hardlinkquelle="D:\daten\Downloads\Makros""
D:\hardlink\mklink /j %hardlinkziel% %hardlinkquelle%

Möglichkeit B.)
Bei der Wertzuweisung an die Variable wird der Pfad NICHT in zusätzliche Anführungszeichen gesetzt.
In diesem Fall muß bei der Befehlsausführung die Variable MIT Anführungszeichen aufgerufen werden, da der Pfad mindestens 1 Leerzeichen enthält.
Beispiel B.)
set "hardlinkziel=c:\apps\Microsoft Office\Macros"
set "hardlinkquelle=D:\daten\Downloads\Makros"
D:\hardlink\mklink /j "%hardlinkziel%" "%hardlinkquelle%"

Anders verhält es sich, wenn die Pfadangabe KEINE Leerzeichen enthält.
Da können ALLE VIER Kombinationen fehlerlos verwendet werden.
1.) Wertzuweisung mit zusätzlichen Anführungszeichen und Variablenaufruf mit Anführungszeichen
2.) Wertzuweisung mit zusätzlichen Anführungszeichen und Variablenaufruf ohne Anführungszeichen
3.) Wertzuweisung ohne zusätzlichen Anführungszeichen und Variablenaufruf mit Anführungszeichen
4.) Wertzuweisung ohne zusätzlichen Anführungszeichen und Variablenaufruf ohne Anführungszeichen

Zusatz.
Diese Erkenntnis betrifft sowohl den Befehl "mklink" für die Erstellung eines Links,
als auch den Befehl "mkdir" für die Erstellung eines oder mehrerer Verzeichnisse.

Gerry
rubberman
rubberman 01.02.2022 um 22:30:01 Uhr
Goto Top
Versuche Variablenwerte ohne umschließende Anführungszeichen zu erstellen. Einfach weil es einfacher ist sie bei Bedarf um die Variable zu setzen, als sie vom Wert zu entfernen falls sie stören sollten (bspw. beim Verketten von mehreren Strings).
Die Anführungszeichen in der Syntax ...
set "varname=value"
... schützen dich bei der Zuweisung ausreichend vor Sonderzeichen, wie etwa einem & im Wert.

Steffen
gerry56
gerry56 02.02.2022 um 03:37:36 Uhr
Goto Top
Danke für den Tip.

Gerry