Erstellen Sie in Windows 10 einen relativen symbolischen Link für Dateikopien

2742
Stephen Hanson

Ich werde alles, was ich versucht habe, drastisch vereinfachen. Genaue Informationen finden Sie im CMD- Screenshot.

Ich möchte einen symbolischen RELATIVE PFAD-Link erstellen, [ RESOURCES ]der unter folgendem Pfad benannt wird:

C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music 

Das sollte auf Folgendes hinweisen:

C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\{[ LONGCHAR REDIRECT ]} 

Ich habe mklink /Din cmd als Admin versucht, mit den folgenden Schritten.

  1. Navigieren Sie zu dem Verzeichnis, in dem der symbolische Link erstellt werden soll.

    cd "C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music" 
  2. Erstellen Sie den symbolischen Link.

    mklink /d "[ RESOURCES ]" "../../../{[ LONGCHAR REDIRECT ]}" symbolic link created for [ RESOURCES ] <<===>> ../../../{[ LONGCHAR REDIRECT ]} 

Um das Beste aus meinem Verständnis, diese Syntax sollte die Verbindung setzen {[ LONGCHAR REDIRECT ]}in [ SOURCE ]Bezug auf, Musicaber es funktioniert nicht!

Die Bestätigung zeigt an, dass der Link erfolgreich erstellt wurde. Wenn ich jedoch auf den symbolischen Link zugreifen möchte, erhalte ich die folgende Fehlermeldung:

cd "C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music\[ RESOURCES ]" C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music\[ RESOURCES ] is not accessible.   The filename, directory name, or volume label syntax is incorrect. 

Verstehe ich die Verwendung von .., um ein übergeordnetes Verzeichnis anzugeben? Fühlen Sie sich bitte frei, meine zahlreichen Experimente über den CMD- Screenshot zu überprüfen . Ich habe mehrere Varianten der relativen Dateipfad Thema versucht, mit .., .und um das aktuelle Verzeichnis zu ändern.

Wenn mklinkdie gewünschte Zuordnung nicht implementiert wird, können Sie auch eine relative Dateipfadalternative empfehlen. Ich kopiere das [ GLOBAL ]Verzeichnis auf verschiedene Laufwerke und Sicherungsdienste. Ich muss also die Dateipfade 260 MAX_PATHüber die tatsächliche Position im {[ LONGCHAR REDIRECT ]}Ordner unter der Einschränkung abschneiden, damit sie über jeden doppelten Speicherort angezeigt wird. Ich brauche jedoch mein Arbeitsverzeichnis, um ihre virtuellen Speicherorte in einzufügen der [ RESOURCES ]Ordner.

0
Ihr Beispiel für den Fehler fehlt tatsächlich in Ihrem Screenshot. Die Verwendung weniger schreiender Namen (alles in Großbuchstaben) würde die Augen sehr viel einfacher machen. Seth vor 6 Jahren 0
Der Screenshot soll "alles, was ich versucht habe" erweitern. Der Block-zitierte Dialog sollte mehr als ausreichend sein, um den genauen Fehler zu übermitteln. Stephen Hanson vor 6 Jahren 0

3 Antworten auf die Frage

1
Seth

Sie verwenden falsche Schrägstriche, wenn Sie aus dem aktuellen Verzeichnis auf ein übergeordnetes Element verweisen möchten. In diesem Fall müssen Sie einen Backslash verwenden. Vorwärtsschrägstriche funktionieren, wenn Sie nur auf Kinder verweisen möchten. Bei einem absoluten Pfad scheint es keine Rolle zu spielen.

mkdir C:\temp\example\a mkdir C:\temp\example\b\c mklink /D C:\temp\example\a\redirection ..\b 

Verwenden Sie für die Begrenzung von 260 Zeichen eine Anwendung, die es behandelt, anstatt nach einer leicht zu brechenden Problemumgehung zu suchen oder Ihre Pfade zu verkürzen.

Sie wissen, das ist Super User, richtig? Die Bitte, eine Anwendung zu finden, um lange Dateinamen zu verwenden, erscheint mir wie ein defekter Workaround. Ich verwende mehrere Anwendungen, die auf kompatiblen 260 MAX_PATH-Dateinamen angewiesen sind. Wenn Sie mich auf eine Dokumentation verweisen können, die auf etwas anderes hinweist, das auf ALLE Anwendungen hinweist, die auf einen übermäßig langen Dateinamen verweisen, könnte ich in Betracht ziehen, zu wechseln. Andernfalls ist Ihr Vorschlag unbrauchbar. Stephen Hanson vor 6 Jahren 0
Ich habe auch festgestellt, dass Ihr Vorschlag, dass nur die Schrägstriche unvollständig sind. Das Problem war BEIDE Schrägstriche UND die Tatsache, dass mein Pfadname Leerzeichen enthielt. Die Lösung, die ich JUST gefunden habe, war folgender Befehl: C: \ Benutzer \ crack \ Dokumente \ [GLOBAL] \ [QUELLE] \ [INITIATIVEN] \ Audio \ Music> mklink / D "[RESOURCES]" .. \ .. \ .. \ "{[LONGCHAR REDIRECT]}" Ich wusste nicht, dass Sie Anführungszeichen in Verbindung mit nicht mit Anführungszeichen versehenen ".." - Operatoren verwenden könnten. Stephen Hanson vor 6 Jahren 0
@Seth Slashes funktionieren im Allgemeinen für mklink in cmd.exe. Ich habe gerade folgendes getestet: 'mklink / J target "src / murks"' in "src" funktioniert und macht "murks" als Ziel verfügbar. Thorsten Schöning vor 6 Jahren 0
@StephenHanson Sie sprechen nur vom "Kopieren" von Dingen und zu Sicherungszwecken. Apps wie XCOPY oder ROBOCOPY sind in der Lage, lange Unicode-Dateinamen zu verarbeiten. Jede sinnvolle Sicherungs-App sollte ebenfalls gut sein oder sie ist einfach kaputt. Wenn Sie also nicht detaillierter über die von Ihnen verwendeten Apps berichten, empfiehlt es sich, diese nicht zu verwenden, wenn sie keine langen Dateinamen unterstützen. Thorsten Schöning vor 6 Jahren 1
@ Thorsten Warum gibt es ein MAX_PATH-Limit, wenn ich es einfach ignorieren sollte? Ich gehe davon aus, dass die Integrität der Standardanwendungen und der Arbeitsbedingungen des Windows-Betriebssystems erhalten bleibt. Wenn ich anfange, eigene Anwendungen zu entwickeln, gehe ich zu Stack Overflow und Ihre Antwort ist vernünftig. Für den alltäglichen "Super User" scheint das Umgehen von Dateisystemkonventionen jedoch unverantwortlich zu sein. Stephen Hanson vor 6 Jahren 0
Auch @Thorsten, Anwendungen selbst sind nicht das Problem. Selbst MANUELLES Verschieben / Löschen / Ändern von Dateien kann zu Problemen führen, wenn die Dateien die Länge von MAX_PATH überschreiten. Ich habe genug Kopfschmerzen durchgemacht. Stephen Hanson vor 6 Jahren 0
@StephenHanson MAX_PATH ist wegen der Abwärtskompatibilität mit älteren älteren Apps, die nur von DOS und nicht unter Windows NT stammen, Microsoft hat ziemlich gute Dokumente zu diesem Thema: https://msdn.microsoft.com/de-de/library/windows/desktop/ aa365247 (v = vs.85) .aspx # maxpath Thorsten Schöning vor 6 Jahren 1
@ ThorstenSchöning Danke für den Hinweis. Ich habe diese Informationen hinzugefügt. In diesem speziellen Fall funktioniert es nicht, da er ein Elternteil referenzieren möchte. Seth vor 6 Jahren 0
@StephenHanson, so dass Sie MAX_PATH bereits aktiv umgehen / ignorieren, jedoch den Vorschlag, entweder die von Ihnen verwendeten Anwendungen zu korrigieren (indem Sie Äquivalente verwenden, die längere Pfade verwenden, oder einen Pfadindikator verwenden, der dieses Limit nicht aufweist) oder das Problem beheben Dateistruktur ist nicht machbar? Außerdem müssen Sie für Pfade, die Leerzeichen enthalten, Anführungszeichen verwenden. Ihr Beispiel hat bereits gezeigt, dass Sie sich dessen bewusst zu sein scheinen, also konzentrierte sich die MWE nur auf die Referenz. Was nicht funktioniert hat, weil Sie Backslashes brauchen. Seth vor 6 Jahren 0
@Seth Meine Aussage war nicht klar, während Slashes im Allgemeinen funktionieren, nicht für symbolische Links, genau wie Sie gesagt haben. Ich habe es nur mit Junctions versucht, diese werden anders gehandhabt, der Pfad wird anders aufgelöst, während die Pfade für Symlinks als Text für den Symlink gespeichert werden. In diesen Fällen sind Sie sicherlich richtig, / wird höchstwahrscheinlich niemals unterstützt. Thorsten Schöning vor 6 Jahren 0
@Seth Das Erstellen einer funktionierenden Problemumgehung mithilfe integrierter Befehle über eine Befehlszeile "umgeht" nicht in dem Maße, dass die MAX_PATH-Implementierung unnötig überschreitet, was den Ersteller bedenkenlos verursacht. Dateien unter meiner Lösung sind durch manuelle Manipulationen eines einzigen Benutzers perfekt handhabbar. Dateien, die MAX_PATH überschreiten, sind jedoch nicht zulässig. Ihr Brute-Forciert eine systemweite Sicherheits- und Stabilitätsmaßnahme. Meine erstellt einfach funktionierende Verweise auf Dateien, die vollständig den Anforderungen derjenigen entsprechen, die Anwendungen entwickeln, die den Regeln entsprechen. Stephen Hanson vor 6 Jahren 0
1
Thorsten Schöning

Drei Dinge:

  1. Verwenden Sie keine symbolischen Links, es sei denn, dies ist unbedingt erforderlich, da Sie standardmäßig als Administrator angemeldet sein müssen. Wenn Sie nur Verzeichnisse lokal verknüpfen möchten, verwenden Sie Junctions, die auch von einem eingeschränkten Standardbenutzer unterstützt werden.

  2. Versuchen Sie, Software zu ersetzen, die keine langen Unicode-Dateinamen unterstützt, was häufig möglich ist. Diese langen Dateinamen gibt es schon seit NTFS und Windows NT, daher sollte Software dies einfach unterstützen, und viele Frameworks / Runtimes wie Java tun dies standardmäßig. Software, die Dinge kopieren oder sichern soll, die keine langen Dateinamen unterstützt, ist ziemlich fehlerhaft und hat sicherlich auch andere gravierende Einschränkungen, insbesondere bei Backups. Denken Sie an Dinge wie Berechtigungen, den richtigen Umgang mit verschiedenen Links und Dateitypen, alternative Datenströme usw. Man muss vorsichtig sein.

  3. Der Grund für Ihr tatsächliches Problem scheint in den Unterschieden in den symbolischen Links und in den Junctions zu liegen oder möglicherweise in der Art und Weise, wie die von der Shell bereitgestellten Pfade analysiert werden:

C: \ Users \ tschoening \ Documents \ test \ target> mklink / J "[target]" "../ src / {[murks]}"

Verbindung erstellt für [target] << === >> ../ src / {[murks]}

C: \ Users \ tschoening \ Documents \ test \ target> cd "[target]"

C: \ Benutzer \ tschoening \ Documents \ test \ target [target]> cd ..

C: \ Benutzer \ tschoening \ Documents \ test \ target>

Wie Sie sehen können, funktioniert der Zugriff auf "[Ziel]" auf diese Weise, während Folgendes nicht den gleichen Fehler erzeugt wie Sie, und zwar nur auf Deutsch:

C: \ Users \ tschoening \ Documents \ test \ target> mklink / D "[target]" "../ src / {[murks]}"

symbolische Verknüpfung erstellt für [target] << === >> ../ src / {[murks]}

C: \ Users \ tschoening \ Documents \ test \ target> cd "[target]"

Die Syntax für den Dateinamen, die Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.

C: \ Benutzer \ tschoening \ Documents \ test \ target>

Zumindest sehe ich in meinem Test keinen anderen Unterschied als / J vs. / D, aber mir fehlt natürlich etwas. Ich empfehle daher, den Test mit Junctions selbst zu wiederholen.

Einige weitere interessante Dinge, die ich gerade erkannt habe: Das Öffnen des erstellten Symlinks mit der obigen Syntax in cmd.exe und Windows Explorer schlägt fehl, aber es gelingt in Link Shell Extension. Schauen Sie sich den folgenden Screenshot an, der den relativen Pfad zeigt. Durch Klicken auf "Ziel öffnen" wird ein neuer Windows Explorer-Ordner mit dem Linkziel geöffnet. Sieht so aus, als ob die Link Shell Extension / sich selbst interpretiert und \ der zugrunde liegenden Windows-API zur Verfügung stellt. Etwas, das Windows selbst nicht tut, sondern einfach die Verwendung von / as im Link selbst, was für Pfade falsch ist. Wie @Seth bereits erkannt hat, ist das / selbst das Problem mit den Symlinks.

Link Shell Extension showing the tested symlink

Ich bat um Symlinks und erklärte ausdrücklich, dass ich RELATIVE-Dateipfade benötige. Ja, Sie haben vermisst, dass symbolische Links RELATIVE-Dateipfade unterstützen, und Junctions NICHT. Natürlich bin ich Admin. Wie würde ich sonst noch Software installieren? Sie scheinen auch die Tatsache zu übersehen, dass das Überschreiten von MAX_PATH dazu führt, dass manuelle Dateibearbeitungen fehlschlagen. Ich habe auch meine eigene Frage beantwortet, wenn Sie neugierig auf die ACTUAL-Ausgabe waren. Es war eine einfache Syntaxänderung. Stephen Hanson vor 6 Jahren 0
@StephenHanson Ich verwende in meinem Test relative Dateipfade. Darüber hinaus bieten Junctions die gleiche Funktionalität wie echte Symlinks in Ihrem Fall, ohne dass Administratorrechte benötigt werden. Im Allgemeinen muss ein Administrator nicht die ganze Zeit ein Administrator sein, um nur Software zu installieren oder Dinge nur einmal zu verwalten. Tatsächlich ist es einfach eine schlechte Praxis, die ganze Zeit über Administratoren zu sein. Daher wird Junctions bevorzugt, wenn dies möglich ist. Thorsten Schöning vor 6 Jahren 0
Wenn sich der Ordner "src" im Ordner "test" befindet, erstellen Sie eine JUNCTION mit einem ABSOLUTE-Dateipfad. Stephen Hanson vor 6 Jahren 0
@StephenHanson Mir war nicht klar, dass Sie auch den Symlink selbst mit seinem relativen Pfad kopieren möchten. Ändert sich nicht viel, Ihr Ansatz scheint immer noch verschiedene Vorbehalte zu haben: Sie benötigen überall spezielle Berechtigungen, um Ihren Symlink zu erstellen, Sie benötigen Werkzeuge, die in der Lage sind, den Symlink unterschiedlich zu handhaben, Sie haben anscheinend einen Kreis in Ihrer Verzeichnisstruktur angelegt, wenn Sie kopieren GLOBAL um, was dazu führen kann, dass einige Tools ebenfalls fehlschlagen usw. Thorsten Schöning vor 6 Jahren 1
0
Stephen Hanson

Zunächst sollten wir uns die Syntax der Optionen und erforderlichen Parameter ansehen, die durch Eingabe der Hilfeanforderung für den mklinkBefehl generiert werden mklink /?:

MKLINK [[/D] | [/H] | [/J]] Link Target  /D Creates a directory symbolic link. Default is a file symbolic link. /H Creates a hard link instead of a symbolic link. /J Creates a Directory Junction. Link Specifies the new symbolic link name. Target Specifies the path (relative or absolute) that the new link refers to. 

Derzeit ist es nur möglich, relative Dateipfad-Daten in Verzeichnissymbolverknüpfungen einzuführen.

Deshalb müssen wir die Verwendung mklinkBefehl in Verbindung mit der ( „Soft - Link“) mklinkBefehlsoption, /Dwie so.

mklink /D. . .

Der mklink TargetParameter muss einen Dateipfad beschreiben, der mindestens einen RELATIVE FILEPATH-OPERATOR enthält, z. B. .oder ..in Verbindung mit so vielen BACKSLASHES ( \), wie es die relative Hierarchie von (Grand-, Great-Grand- usw.) übergeordneten Verzeichnissen sowie dies erfordert einen "DOUBLE-QUOTED- "Dateipfad in jedem Fall, in dem ein oder mehrere Whitespace-Zeichen für ein untergeordnetes ABSOLUTE-Dateipfadfragment des zu verkettenden relativen mklink TargetDateipfad der Verknüpfung erforderlich sind.

Der Befehl wurde beendet

mklink /D "C:/Test Folder/Link Name With Spaces". . .

indem Sie den mklink TargetParameter mit ersetzen

. . ...\"Target Name With Spaces"

oder

. . ."..\Target Name With Spaces"

erstellt ein erfolgreich verkettetes relatives Dateipfadziel innerhalb einer Verknüpfung, die am erstellt wird

C:/test foldEr/Link Name With Spaces

und Fertigstellung

mklink /D "C:/Test Folder/Test Folder 2/Link Name With Spaces". . .

mit

. . ."..\..\Target Name With Spaces"

oder

. . ...\..\"Target Name With Spaces"

wird einen Link bei erstellen

C:/Test Folder/Test Folder 2/Link Name With Spaces.

In allen vier Fällen ist das Endergebnis ein Verzeichnissymbollink, der auf das Verzeichnis verweist

C:/TaRget nAme WitH SpacEs.

der jedoch auf einen anderen Speicherort verweist, wenn eine der generierten Verknüpfungen in einen anderen Ordner verschoben wird, entweder durch einen Befehl wie robocopyoder durch eine Anwendung, die symbolische Verknüpfungen in ähnlicher Weise berücksichtigt.

Das ist eigentlich falsch. Das einzige, was Sie tun müssen, ist die Verwendung von Backslashes anstelle eines normalen Slash. Die Verwendung von ".. \ irgendwas anderes" funktioniert problemlos. Seth vor 6 Jahren 0
@Seth, Deine ursprüngliche Antwort auf meine Frage war falsch. `mkdir C: \ temp \ example \ a mkdir C: \ temp \ example \ b \ c mklink / DC: \ temp \ example \ a \ redirection .. \ b`, während die Schrägstriche umgekehrt wurden, enthielt KEINE Anführungszeichen. Die Anführungszeichen sind notwendig, wenn der Dateipfad Leerzeichen enthält. Da mein Szenario in DIESEM speziellen Kommentarthread genauso funktioniert wie Ihr Szenario, spielt es keine Rolle, wo sie verwendet werden, sofern sie die Leerzeichen dazwischen enthalten. Stephen Hanson vor 6 Jahren 0
Es ist nicht erforderlich, nur das Verzeichnis mit den Leerzeichen anzugeben. Erleichtern Sie Ihr Leben, indem Sie einfach das Ganze zitieren. Das ist es, worauf ich hinweise. Ihr ursprünglicher Kommentar sagte, dass Sie nicht zitiertes ".." verwenden müssen, was falsch ist. Sie haben es wahrscheinlich in Ihrem Schnitt behoben. Seth vor 6 Jahren 0
@Seth habe ich getan, aber meine Behauptung sollte vermitteln, dass Zitate durch die Einbeziehung von Whitespace-Zeichen erforderlich sind. Stephen Hanson vor 6 Jahren 0