12

Windows原生替代方案ln -smklink.

有什么本地替代品readlink吗?或者如何本地识别文件是否是符号链接?

4

2 回答 2

9

无需将标准输出重定向到 temp.txt 文件。您可以简单地在一行中执行此操作:

for /f "tokens=6" %i in ('dir mysymlink ^| FIND "<SYMLINK>"') do @echo %i

另请注意,Lars 的上述方法仅适用于“文件”符号链接。该方法必须针对目录符号链接进行调整,因为将目录传递给“dir”命令将列出该目录的实际内容(其中不会有自己的内容)

所以你会使用:

for /f "tokens=6" %i in ('dir mysymlink* ^| FIND "<SYMLINKD>"') do @echo %i

请注意在 dir 调用中包含 * 并在 FIND 中添加“D”

星号将阻止 dir 列出该目录的内容。

为了进一步简化处理文件或目录符号链接的过程,您只需始终包含星号,对于 FIND 参数,您可以将其更改为部分匹配,以便它在末尾匹配或不匹配“D”

for /f "tokens=6" %i in ('dir mysymlink* ^| FIND "<SYMLINK"') do @echo %i

最后,由于该方法实际上返回了括号 [].. 内的文件,因此最好将它们分隔开,留下最后的方法:

for /f "tokens=2 delims=[]" %i in ('dir mysymlink* ^| FIND "<SYMLINK"') do @echo %i
于 2014-12-10T17:39:33.627 回答
6

我不相信有任何工具直接等同于readlink. 但是您可以在输出中看到dir项目是否为符号链接,因此您仍然可以从命令行或脚本中确定这一点。

测试它是否是符号链接

您可以使用以下语法轻松测试给定文件是否是符号链接:

 dir mysymlink  | find "<SYMLINK>" >NUL
 if not errorlevel 1  echo. It's a symlink!

如果找到 " ",Errorlevel 将为 0,<SYMLINK>否则为 1。

确定符号链接的目标

确定符号链接的实际目标是另一回事,在我看来并不那么简单。的输出dir mysymlink | find "<SYMLINK>"可能看起来像

11/13/2012  12:53 AM    <SYMLINK>      mysymlink [C:\Windows\Temp\somefile.txt]

你可以解析这个,但是有些字符很难处理一个变量,所以我发现处理一个临时文件更容易:

 dir mysymlink | find "<SYMLINK>" > temp.txt
 for /f "tokens=6" %i in (temp.txt) do @echo %i

这会产生类似的输出[C:\Windows\Temp\somefile.txt]。(请记住%%i在任何批处理脚本中使用;以上来自命令提示符。)

要获得不带括号的结果,您可以执行以下操作:

 dir mysymlink | find "<SYMLINK>" > temp.txt
 for /f "tokens=6" %i in (temp.txt) do set answer=%i
 echo %answer:~1,-1%

变量%answer%包含带括号的结果,%answer:~1,-1%因此没有第一个或最后一个字符的结果。

于 2012-11-13T09:13:53.747 回答