Windows上readlink的本机替代方案

时间:2012-11-08 21:49:54

标签: windows cmd native symlink

ln -s的Windows 原生替代方案为mklink

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

2 个答案:

答案 0 :(得分:7)

无需将stdout重定向到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

答案 1 :(得分:6)

我不相信有任何工具直接等同于readlink。但是你可以在dir的输出中看到一个项是否是一个符号链接,所以你仍然可以从命令行或脚本中确定它。

测试它是否是符号链接

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

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

如果找到“<SYMLINK>”,则Errorlevel为0,否则为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%是没有第一个或最后一个字符的结果。