【问题标题】:How to follow a symbolic/soft link in cmd or PowerShell?如何在 cmd 或 PowerShell 中跟踪符号/软链接?
【发布时间】:2019-02-16 22:59:45
【问题描述】:

我的搜索只向我展示了如何在 cmd 中使用 mklink 创建符号链接。看到有些东西说要使用readlink,但是PowerShell和cmd不知道readlink是什么,而cd显然不行.那么我该如何关注呢?

【问题讨论】:

    标签: windows powershell cmd symlink desktop-shortcut


    【解决方案1】:

    为避免因您的问题引起的混淆:

    • Windows shortcut files (*.lnk files)Windows (GUI) shell 的一个功能,不同于 symbolic links (symlinks),后者是 (NTFS) 文件系统的一个功能

    • 快捷方式文件 - 您感兴趣 - 将它们指向的文件或文件夹的路径存储在文件中,这就是为什么:

      • 不能直接cd 到快捷方式文件的目标文件夹,因为cd 等文件系统命令对文件的内容一无所知。
      • 必须读取快捷方式文件的内容以确定其目标,然后您可以将其传递给cdSet-Location(在PowerShell 中)。
      • 快捷方式文件的文件格式是二进制格式,可以通过in-box COM component 读取,该in-box COM component 公开了Windows shell 功能;例如,要确定名为 Samples.lnk 的快捷方式文件的目标文件夹并切换到该文件夹​​,请使用 PowerShell:

        # NOTE: * Despite the name "CreateShortcut()", the method is also
        #         used to *read* shortcut files.
        #       * Prefixing the filename with "$PWD/" is needed in order
        #         to target a file in the current directory, because
        #         the method doesn't know what PowerShell's current dir. is.
        cd (New-Object -ComObject WScript.Shell).CreateShortcut("$PWD/Samples.lnk").TargetPath
        
    • 符号链接,相比之下:

      • (通常)透明地重定向到它们的目标,即它们指向的文件系统项(文件或文件夹)。

      • 因此,您可以直接将cd 与指向文件夹的符号链接一起使用,但请注意,显示的仍然是符号链接 的路径。

      • 打印符号链接的目标 - 类似于 readlink 实用程序在 类 Unix 平台上所做的事情 - 使用 PowerShell;例如,打印当前目录中名为 Samples 的符号链接的目标:

         (Get-Item Samples).Target
        
         # Or, after running `cd Samples`:
         (Get-Item .).Target
        
      • 请注意,在cmd.exe 中获取符号链接的目标并不简单,但如果您使用
        dir /al <link-path>*,列表还将显示链接的目标路径,在名称之后,包含在@987654339 中@;请注意,结尾的* 是必要的,以便显示有关链接本身的信息,而不是其目标的内容;请注意,虽然不太可能,但它也可能匹配以相同路径开头的其他链接。


    与快捷方式文件不同,符号链接在 Windows 世界中仍然很少见,尤其是因为在 Windows 10 之前,它们总是需要管理员权限才能创建;在 Windows 10 中,如果(由管理员)启用了开发人员模式,即使是非管理员用户/非提升的进程现在也可以创建符号链接 - 请参阅 https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/,这也解释了为什么符号链接可能会在未来

    【讨论】:

    • 感谢您提供额外信息。你知道我如何创建硬链接吗?即使使用提升的 cmd,我也无法创建它们。我相信这是因为 Windows 默认将所有文件夹设置为只读。取消选中只读框仅适用于文件夹中的文件。
    • @Deoxal:硬链接只能针对 files,因此您需要使用 symlinks(符号链接)或 junctions 如果您想定位文件夹。我建议使用符号链接,它提供了最大的灵活性(它们也可以针对其他卷/机器上的文件夹)。
    【解决方案2】:

    对于你的问题,我制作了这个批处理文件:

    mkdir truedir
    dir > truedir\fileone.txt
    mklink /d symdir truedir
    cd symdir
    dir
    

    我发现从命令提示符获取目录的符号链接内容没有问题。 powershell 5.1(win 10)也没有问题:

    Get-ChildItem C:\Users\<user>\OneDrive\Desktop\test2\symdir
    

    您能给我们一个代码示例(batch 或 powershell 都一样)来复制您的问题吗?

    【讨论】:

    • 感谢您的帮助。我认为 .lnk 文件是符号链接,但我意识到现在情况并非如此。你知道如何关注 .lnk 吗?如果没有,我可以创建实际的符号链接。
    • 感谢您为我指明了正确的方向。现在我的条款已经理顺了,我现在应该可以做到了。
    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多