【问题标题】:windows symbolic link targetwindows符号链接目标
【发布时间】:2012-04-28 15:08:01
【问题描述】:

说我设置了符号链接:

mklink  /D C:\root\Public\mytextfile.txt C:\root\Public\myothertextfile.txt

编者注:选项 /D - 用于创建 目录 符号链接 - 与本例中的目标 files 不一致,这导致一些混乱。要创建 file 符号链接,只需省略 /D

有没有办法通过命令行查看mytextfile.txt的目标是什么?

【问题讨论】:

  • 或者如果可能的话我如何在 perl 中追踪链接
  • 有一个名为 mytextfile.txt 的目录有点奇怪;您确定要使用 /D 选项吗?
  • 反正“dir”命令默认显示符号链接的目标。

标签: windows symlink


【解决方案1】:

正如 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]

【讨论】:

  • 这实际上是一个连接点,不是符号链接,而是符号链接的目录列表看起来非常相似。
  • 使用git bash时,dir不可用,但可以改写cmd //C dir
  • 另外,在使用 Powershell 时,dir 可能是别名。就像关于 git bash 的评论一样,使用cmd /C dir 来获得预期的输出。
【解决方案2】:

也许有人对解析目录中所有目录符号链接的 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; }
}

【讨论】:

    【解决方案3】:

    补充Paul Verest's helpful answer

    • 虽然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
    

    【讨论】:

      【解决方案4】:

      所有感谢 @SecurityAndPrivacyGuru , [cmd]

      读取符号链接{|s in folder}并输出列表及其目标路径的完整批处理脚本/函数

      @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
      

      【讨论】:

        【解决方案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
        

        【讨论】:

        • ^ 是转义字符。在命令符号前添加转义字符可以将其视为普通文本。当管道或重定向任何这些字符时,您应该使用转义字符作为前缀:& \ ^ |
        【解决方案6】:

        命令行选项

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

        使用 Windows GUI

        或者,如果您想使用 Windows GUI 界面(特别是文件属性窗口)查看符号链接的目标,请安装 Windows Link Shell Extension(直接链接到文件下载):

        超级用户 Julian Knight 的 answer 对我来说效果很好。

        安装 Windows Link Shell 扩展后,您可以在 Windows 资源管理器中右键单击该链接并检查属性。有一个选项卡可以让您直接更改链接。

        安装了Link Shell Extension

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

        顺便说一句

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

        【讨论】:

          猜你喜欢
          • 2012-07-03
          • 1970-01-01
          • 2014-08-06
          • 2010-11-29
          • 2014-11-22
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          • 2013-12-14
          相关资源
          最近更新 更多