windows 如何跟随cmd或PowerShell中的符号/软链接?

bvuwiixz  于 2023-02-20  发布在  Windows
关注(0)|答案(3)|浏览(276)

我的搜索只显示了如何在cmd中使用mklink创建符号链接。我看到一些东西说要使用readlink,但PowerShell和cmd不知道readlink是什么,而且cd显然不起作用。那么我如何遵循一个呢?

7ivaypg9

7ivaypg91#

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

  • 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>*,则该列表还将显示链接的目标路径,在名称之后,用[...]括起来;注意,为了显示关于链接本身的信息,而不是其目标的 * 内容 *,尾随的*是必需的;注意,尽管不太可能,但这也可以匹配以相同路径开始的其它链路。
与快捷方式文件不同,符号链接在Windows世界中仍然很少见,尤其是因为在Windows 10之前,它们 * 总是 * 需要管理员权限才能创建;在Windows 10中,如果(由管理员)启用开发人员模式,即使是非管理员用户/未提升权限的进程现在也可以创建符号链接-参见https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/,这也解释了符号链接在未来可能会越来越多地使用的原因。

oxcyiej7

oxcyiej72#

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

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

而且我发现从命令提示符获取到目录的symblic链接的内容没有问题。powershell 5. 1(win 10)也没有问题:

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

你能给予我们一个代码示例(批处理或powershell是一样的)来重现你的问题吗?

wh6knrhe

wh6knrhe3#

好吧,我刚刚在另一个类似的问题中发布了这个答案,所以我想我也会在这里发布它。我希望这个问题像另一个问题一样出现在搜索中,因为@mklement0的答案很棒。但这里是我的解决方案,它能够沿着嵌套链接到达PowerShell中的真实文件或目录(我正在寻找一个特定于PS的解决方案,而不是CMD)。
到目前为止,双cd方法是我所能找到的处理文件名和目标中混合相对/绝对路径情况的最可靠/最通用的方法,我测试了几个场景。

function getLinkTarget($fn) {
    $op=$PWD #Save original path
    while($t=(Get-Item $fn).Target) { #Get link target
        cd (Split-Path -Parent $fn) #cd to parent of file/dir
        cd (Split-Path -Parent $t) #cd again to parent of target
        $fn=(Split-Path -Leaf $t) #Set filename to relative target
    }
    $fn=(Join-Path $PWD $fn) #Make path absolute
    cd $op #Change back to original path
    return $fn
}

相关问题