Windows符号链接目标

39

假设我设置了一个符号链接:

mklink  /D C:\root\Public\mytextfile.txt C:\root\Public\myothertextfile.txt
编辑注:选项/D用于创建目录符号链接,与本示例中的针对文件的目标存在冲突,这引起了一些混淆。要创建文件符号链接,只需省略/D

如何使用命令行查看mytextfile.txt的目标?


如何在Perl中跟踪链接? - Sree Ram
7
目录名称为mytextfile.txt有点奇怪,您确定要使用/D选项吗? - Harry Johnston
6
无论如何,“dir”命令默认会显示符号链接的目标。 - Harry Johnston
7个回答

29

正如Harry Johnston所说,dir命令会显示符号链接的目标。

2014/07/31  11:22    <DIR>          libs
2014/08/01  13:53             4,997 mobile.iml
2014/07/31  11:22               689 proguard-rules.pro
2014/09/28  10:54    <JUNCTION>     res [\??\C:\Users\_____\mobile\src\main\res]

6
那实际上是一个交汇点,而不是符号链接,但符号链接的目录列表看起来非常相似。 - Harry Johnston
3
在使用 Git Bash 时,dir 命令不可用,但可以使用 cmd //C dir 命令代替。 - jakub.g
1
此外,在使用 Powershell 时,dir 可能是一个别名。就像关于 git bash 的评论一样,使用 cmd /C dir 来获取预期的输出。 - CrazyIvan1974

19

为了补充Paul Verest有益的回答

  • 虽然cmddir命令确实显示了链接类型和目标路径,但是提取该信息并不容易-请参见下面的PowerShell替代方法。

  • 要发现当前目录中的所有链接,请使用dir /aL命令。

PowerShell (PSv5+)解决方案:

列出当前目录中所有链接及其目标作为完整路径:

PS> Get-ChildItem | ? Target | Select-Object FullName, Target

FullName                      Target
--------                      ------
C:\root\public\mytextfile.txt {C:\root\Public\myothertextfile.txt}
确定给定链接的目标:
PS> (Get-Item C:\root\Public\mytextfile.txt).Target
C:\root\Public\myothertextfile.txt

1
Get-ChildItem | ? Target | Select-Object FullName, Target | Format-List 如果路径被截断显示为 ... - cyclingLinguist

5

编写一个批处理文件(get_target.bat)来获取符号链接的目标:

@echo off
for /f "tokens=2 delims=[]" %%H in  ('dir /al %1 ^| findstr /i /c:"%2"') do (
    echo %%H
)

例如,要获取目标为C:\root\Public\mytextfile.txt的内容:
get_target.bat C:\root\Public\ mytextfile.txt

1
“^”是转义字符。在命令符号前添加转义字符可以将其视为普通文本。当使用管道或重定向这些字符时,应该在前面加上转义字符:& \ < > ^ |。 - hxysayhi

1
也许有人对一个C#方法感兴趣,该方法类似于Directory.GetDirectories(),可以解析目录中的所有符号链接。要列出连接或文件符号链接,只需更改正则表达式即可。
static IEnumerable<Symlink> GetAllSymLinks(string workingdir)
{
    Process converter = new Process();
    converter.StartInfo = new ProcessStartInfo("cmd", "/c dir /Al") { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = workingdir };
    string output = "";
    converter.OutputDataReceived += (sender, e) =>
    {
        output += e.Data + "\r\n";
    };
    converter.Start();
    converter.BeginOutputReadLine();
    converter.WaitForExit();

    Regex regex = new Regex(@"\n.*\<SYMLINKD\>\s(.*)\s\[(.*)\]\r");

    var matches = regex.Matches(output);
    foreach (Match match in matches)
    {
        var name = match.Groups[1].Value.Trim();
        var target = match.Groups[2].Value.Trim();
        Console.WriteLine("Symlink: " + name + " --> " + target);

        yield return new Symlink() { Name = name, Target = target };
    }
}

class Symlink
{
    public string Name { get; set; }
    public string Target { get; set; }
}

0

所有的功劳归功于@SecurityAndPrivacyGuru,[cmd]

完整的批处理脚本/函数,读取文件夹中的符号链接{|s}并输出它们及其目标路径的列表

@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"
set br=^


rem br;


set "pafIf=<<pafToSymlink|pafToFolder>>"
set "gIfZsymLink="
for /f "tokens=*" %%q in ('dir "!pafIf!" /al /b') do (
    for /f "tokens=2 delims=[]" %%r in ('dir /al ^| findstr /i /c:"%%q"') do (
        set "gIfZsymLink=!gIfZsymLink!%%~fq>%%r!br!"
    )
)
set "gIfZsymLink=!gIfZsymLink:~0,-1!"
rem echo "!gIfZsymLink!"

for /f "tokens=1,2 delims=>" %%q in ("!gIfZsymLink!") do (
    echo symlink: %%q , filepath: %%r
)


:scIn
rem endlocal
pause
rem exit /b

0

命令行选项

超级用户Julian Knight的答案列出了一些Windows等效于Linux命令的资源。其中最相关的命令是ln.exe。以下是下载链接以及如何使用这些实用程序。

使用Windows GUI

另外,如果您想使用Windows GUI界面(具体来说是文件属性窗口)查看符号链接的目标,请安装Windows Link Shell Extension(直接下载文件的链接):

超级用户Julian Knight的答案对我很有帮助。

安装了Windows Link Shell Extension后,您可以右键单击Windows Explorer中的链接并检查属性。 有一个选项卡允许您直接更改链接。

安装了Link Shell Extension之后:

  • 当你右键单击文件打开“属性”窗口时,它包括一个额外的选项卡:“链接属性”,显示符号链接的目标。
  • 您还可以编辑此目标字段以更改符号链接的目标。
  • 由于该字段是可编辑的,因此复制粘贴目标链接很容易。
  • 滚动查看目标文件的完整路径也很容易!
    (相比之下,在属性窗口中的其他地方,“位置”字段不允许滚动查看您正在检查的文件的完整路径。)

顺便说一句

安装Link Shell Extension后,WAMP服务器图标不再出现在系统托盘中(注意到),这意味着虽然WAMPP仍在运行(本地网站按预期工作),但无法访问任何WAMP功能。
尚不能确定安装是否导致了WAMPP托盘图标消失,但好消息是重新启动后,WAMPP会像往常一样重新出现在系统托盘中。 :-)


0

关于已接受答案的补充说明,在Windows GUI中查看符号链接:

  • 文件夹符号链接标记为“文件夹”
  • 添加属性列有助于区分
  • 大小列报告不一致:仅快捷方式报告实际大小,包括文件夹

下面的每个文件和文件夹都包含相同的2KB数据。

windows gui symlinks


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接