在 Windows 10 中为文件复制创建相对符号链接

在 Windows 10 中为文件复制创建相对符号链接

我将彻底简化我尝试过的一切。有关详细信息,请查看命令截屏。

我想创建一个名为[ RESOURCES ]以下路径的 RELATIVE PATH 符号链接:

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.

我是否误解了表示父目录的用法..?再次,请随时通过命令屏幕截图。我尝试了相对文件路径主题的多种变化,使用..、,.并围绕当前目录进行更改。

如果mklink无法实现所需的关联,请随意推荐一个相对文件路径替代方案。我将目录复制[ GLOBAL ]到各种驱动器和备份服务,因此我需要将文件路径截断到低于260 MAX_PATH其在文件夹中的实际位置的限制{[ LONGCHAR REDIRECT ]},以反映在每个重复位置,但我需要我的工作目录包含它们在[ RESOURCES ]文件夹中的虚拟位置。

答案1

三件事:

  1. 除非绝对必要,否则不要使用符号链接,因为默认情况下您需要管理员身份才能使用它们。如果您只想在本地链接目录,请使用 Junctions,默认受限用户也支持它们。

  2. 尝试替换不支持长 Unicode 文件名的软件,这种情况经常发生。这些长文件名自那时起就一直存在NTFS 和 Windows NT,因此软件应该支持它,许多框架/运行时(如 Java)都支持它。用于复制或备份内容的软件如果不支持长文件名,那么它几乎无法正常工作,而且肯定还有其他严重的限制,尤其是在备份的情况下。考虑权限、正确处理不同的链接和文件类型、备用数据流等。需要小心。

  3. 您实际问题的原因似乎是符号链接与连接点之间的差异,或者可能是 shell 提供的路径的解析方式之间的差异:

C:\Users\tschoening\Documents\test\target>mklink /J“[目标]” “../src/{[murks]}”

创建 [ 目标 ] 关联 <<===>> ../src/{[ murks ]}

C:\Users\tschoening\Documents\test\target>cd“[ 目标 ]”

C:\Users\tschoening\Documents\test\target[ 目标 ]>cd ..

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

如您所见,以这种方式访问​​“[目标]”有效,但以下方法无效,并且会产生与您相同的错误,但仅使用德语:

C:\Users\tschoening\Documents\test\target>mklink /D“[目标]” “../src/{[murks]}”

为 [ 目标 ] 创建符号化 <<===>> ../src/{[ murks ]}

C:\Users\tschoening\Documents\test\target>cd“[ 目标 ]”

日期、文本名称或日期夹层的语法是错误的。

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

至少在我的测试中我没有看到除了 /J 和 /D 之外的任何其他区别,但我当然可能遗漏了一些东西。所以我建议你自己使用 Junctions 重复测试。

我刚刚意识到一些其他有趣的事情:在 cmd.exe 和 Windows 资源管理器中使用上述语法打开创建的符号链接直接失败,但在 Link Shell Extension 中成功。看看下面的屏幕截图,它显示了相对路径。单击“Ziel öffnen”会打开一个新的 Windows 资源管理器文件夹,其中显示链接目标。看起来 Link Shell Extension 正在解释 / 本身,并可能向底层 Windows API 提供 \?Windows 本身并没有这样做,而只是使用 /,正如链接本身所述,这对于路径来说是错误的。所以正如 @Seth 已经认识到的那样,/ 本身就是符号链接的问题。

Link Shell 扩展显示已测试的符号链接

答案2

如果您想从当前目录引用父级,则您使用的斜杠类型不正确。在这种情况下,您需要使用反斜杠。如果您只想引用子级,则可以使用正斜杠。使用绝对路径似乎无关紧要。

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

至于 260 个字符的限制,请使用可以处理它的应用程序,而不是寻找容易破坏的解决方法或缩短路径。

答案3

mklink首先,我们应该看一下通过输入命令help request生成的选项和必需参数的语法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结合使用,就像这样。mklink/D

mklink /D。 。 。

mklink Target参数必须描述一个文件路径,该文件路径包含至少一个相对文件路径操作符(例如...与尽可能多的反斜杠(\)结合使用,以满足(祖父、曾祖父等)父目录的相对层次结构的要求,以及在链接的要连接的相对文件路径的子绝对文件路径片段需要一个或多个空格字符的情况下的双引号文件"路径。"mklink Target

即完成命令

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

通过将mklink Target参数替换为

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

或者

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

将在生成的链接中创建一个成功连接的相对文件路径目标

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但是,如果任何生成的链接被诸如此类的命令或类似支持符号链接的应用程序移动到另一个目录,它将指向完全不同的位置。

相关内容