# 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
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
}
3条答案
按热度按时间7ivaypg91#
为避免您的问题引起混淆:
*.lnk
files)是Windows (GUI) shell的一项功能,与symbolic links (symlinks)不同,后者是(NTFS) 文件系统的一项功能。*快捷方式文件-您感兴趣的文件-将它们指向的文件或文件夹的路径存储在 * 文件内 *,这就是为什么:
cd
指向快捷方式文件的目标文件夹,因为cd
等文件系统命令对文件的 * 内容 * 一无所知。cd
或Set-Location
(在PowerShell中)。Samples.lnk
的快捷方式文件的目标文件夹并更改到该文件夹,请使用PowerShell:*符号链接,相比之下:
(通常)透明地 * 重定向 * 到它们的 * 目标,即它们指向的文件系统项目(文件或文件夹)。
cd
和指向文件夹的符号链接,但注意显示的仍然是 * 符号链接 * 的路径。readlink
实用程序在 * 类Unix平台 * 上所做的-使用PowerShell;例如,打印当前目录中名为Samples
的符号链接的目标:cmd.exe
中获取符号链接的目标并不简单,但是如果使用dir /al <link-path>*
,则该列表还将显示链接的目标路径,在名称之后,用[...]
括起来;注意,为了显示关于链接本身的信息,而不是其目标的 * 内容 *,尾随的*
是必需的;注意,尽管不太可能,但这也可以匹配以相同路径开始的其它链路。与快捷方式文件不同,符号链接在Windows世界中仍然很少见,尤其是因为在Windows 10之前,它们 * 总是 * 需要管理员权限才能创建;在Windows 10中,如果(由管理员)启用开发人员模式,即使是非管理员用户/未提升权限的进程现在也可以创建符号链接-参见https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/,这也解释了符号链接在未来可能会越来越多地使用的原因。
oxcyiej72#
对于你的问题,我做了这个批处理文件:
而且我发现从命令提示符获取到目录的symblic链接的内容没有问题。powershell 5. 1(win 10)也没有问题:
你能给予我们一个代码示例(批处理或powershell是一样的)来重现你的问题吗?
wh6knrhe3#
好吧,我刚刚在另一个类似的问题中发布了这个答案,所以我想我也会在这里发布它。我希望这个问题像另一个问题一样出现在搜索中,因为@mklement0的答案很棒。但这里是我的解决方案,它能够沿着嵌套链接到达PowerShell中的真实文件或目录(我正在寻找一个特定于PS的解决方案,而不是CMD)。
到目前为止,双cd方法是我所能找到的处理文件名和目标中混合相对/绝对路径情况的最可靠/最通用的方法,我测试了几个场景。