Я собираюсь резко упростить все, что я пробовал. Для точных деталей, пожалуйста, просмотрите скриншот CMD .

Я хочу создать символическую ссылку RELATIVE PATH с именем [ RESOURCES ] по следующему пути:

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

Это должно указывать на:

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

Я пробовал mklink /D в cmd как администратор, со следующими шагами.

  1. Перейдите в каталог, в котором должна быть создана символическая ссылка.

    cd "C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music"
    
  2. Создайте символическую ссылку.

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

Насколько я понимаю, этот синтаксис ДОЛЖЕН установить ссылку на {[ LONGCHAR REDIRECT ]} в [ SOURCE ] отношению к Music но это не так!

Подтверждение указывает, что ссылка была создана успешно, но когда я пытаюсь получить доступ к символической ссылке, я получаю следующую ошибку:

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.

Я неправильно понимаю использование .. для указания родительского каталога? Опять же, пожалуйста, не стесняйтесь просматривать мои многочисленные эксперименты через скриншот CMD . Я пробовал несколько вариантов относительной темы пути к файлу, используя .. , . и меняется вокруг текущего каталога.

Если mklink не реализует желаемую связь, пожалуйста, не стесняйтесь рекомендовать альтернативный путь к файлу. Я копирую каталог [ GLOBAL ] на различные диски и службы резервного копирования, поэтому мне нужно, чтобы пути файлов были усечены до ограничения 260 MAX_PATH через их фактическое расположение в папке {[ LONGCHAR REDIRECT ]} чтобы они отражались в каждом дублирующемся местоположении, но Мне нужно, чтобы мой рабочий каталог включал их виртуальные местоположения в папку [ RESOURCES ] .

3 ответа3

1

Вы используете неправильный тип слешей, если хотите сослаться на родителя из текущего каталога. В этом случае вам нужно использовать обратную косую черту. Прямая косая черта работает, если вы хотите ссылаться только на детей. С абсолютным путем это не имеет значения.

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

Что касается ограничения в 260 символов, используйте приложение, которое его обрабатывает, вместо того, чтобы искать легко сломанный обходной путь или сократить ваши пути.

1

Три вещи:

  1. не используйте символические ссылки без крайней необходимости, потому что по умолчанию вы должны быть администратором, чтобы использовать их. Если вы хотите связать каталоги только локально, используйте соединения, которые также поддерживаются ограниченным пользователем по умолчанию.

  2. Попробуйте заменить программное обеспечение, которое не поддерживает длинные имена файлов Unicode, что возможно довольно часто. Эти длинные имена файлов существуют со времен NTFS и Windows NT, поэтому программное обеспечение просто должно их поддерживать, и многие фреймворки / среды выполнения, такие как Java, делают это из коробки. Программное обеспечение, предназначенное для копирования или резервного копирования, которое не поддерживает длинные имена файлов, в значительной степени сломано и, безусловно, имеет и другие серьезные ограничения, особенно в случае резервного копирования. Подумайте о таких вещах, как разрешения, правильная обработка различных ссылок и типов файлов, альтернативные потоки данных и т.д. Нужно быть осторожным.

  3. Причиной вашей реальной проблемы, похоже, являются различия в символических ссылках и соединениях или, возможно, различия в том, как анализируются пути, предоставляемые оболочкой:

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:\Users\tschoening\Documents\test\target [target]> cd ..

C:\Users\tschoening\Documents\ тест \ цель>

Как вы можете видеть, такой способ доступа к «[target]» работает, в то время как следующее не дает и генерирует ту же ошибку, что и у вас, только на немецком языке:

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]"

Синтаксис для даты, времени и времени, фальш.

C:\Users\tschoening\Documents\ тест \ цель>

По крайней мере, я не вижу никакой другой разницы, чем /J против /D в моем тесте, но я могу что-то упустить, конечно. Поэтому я предлагаю повторить ваш тест, используя самих переходов.

Еще одна интересная вещь, которую я только что узнал: открытие созданной символической ссылки с приведенным выше синтаксисом в cmd.exe и Windows Explorer напрямую завершается неудачно, но в Link Shell Extension это удается Посмотрите на следующий снимок экрана, на котором показан относительный путь. При нажатии «Ziel öffnen» открывается новая папка Windows Explorer с указанием цели ссылки. Похоже, расширение Link Shell интерпретирует / само и может предоставить \ для базового API Windows? То, чего сама Windows не делает, а просто использует / как указано в самой ссылке, что неправильно для путей. Так как @Seth уже распознал, сама проблема / является проблемой с символическими ссылками.

Расширение Link Shell, показывающее протестированную символическую ссылку

0

Во - первых, мы должны смотреть на синтаксисе параметров и требуемых параметров генерируемой путем ввода запроса mklink команду справки, 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.

В настоящее время возможно вставить данные относительного пути файла только в символьные ссылки каталога.

Следовательно, мы должны использовать команду mklink вместе с ("soft link") опцией команды mklink , /D , вот так.

mklink /D , ,

Параметр mklink Target должен описывать путь к файлу, который включает по крайней мере один ОТНОСИТЕЛЬНЫЙ ОПЕРАТОР ФАЙЛОВ, такой как . или .. в сочетании с таким количеством BACKSLASHES (\), которое требуется относительной иерархией (grand, great-grand- и т. д.) родительских каталогов, а также с " DOUBLE-QUOTED " filepath в любом случае, когда один или больше пробельных символов требуется дочернему фрагменту пути файла ABSOLUTE относительного конкатенации mklink Target .

Остроумия, заканчивая команду

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

путем замены параметра mklink Target

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

или же

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

создаст успешно сцепленную относительную цель filepath в ссылке, сгенерированной в

C:/test foldEr/Link Name With Spaces

и заканчивая

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

с

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

или же

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

создаст ссылку на

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

Во всех четырех случаях конечным результатом является символьная ссылка на каталог, которая указывает на каталог

C:/TaRget nAme WitH SpacEs ,

но который будет указывать на другое местоположение полностью, если любая из сгенерированных ссылок когда-либо будет перемещена в другой каталог либо с помощью команды, такой как robocopy либо с помощью приложения, которое аналогичным образом учитывает символические ссылки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .