Windows上readlink的本机替代方案

Hon*_*efl 9 windows symlink cmd native

Windows 原生替代品ln -smklink.

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

Dss*_*Dss 7

无需将stdout重定向到temp.txt文件.您可以在一行中执行此操作:

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

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

所以你会用:

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

注意在dir调用中包含*并在FIND中添加"D"

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

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

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

最后,因为该方法实际上返回括号[]内的文件..你最好分隔那些,留下最后的方法:

for /f "tokens=2 delims=[]" %i in ('dir mysymlink* ^| FIND "<SYMLINK"') do @echo %i
Run Code Online (Sandbox Code Playgroud)


小智 6

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

测试它是否是符号链接

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

 dir mysymlink  | find "<SYMLINK>" >NUL
 if not errorlevel 1  echo. It's a symlink!
Run Code Online (Sandbox Code Playgroud)

<SYMLINK>找到" " 的情况下,Errorlevel将为0,否则为1.

确定符号链接的目标

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

11/13/2012  12:53 AM    <SYMLINK>      mysymlink [C:\Windows\Temp\somefile.txt]
Run Code Online (Sandbox Code Playgroud)

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

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

这会产生类似的输出[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%
Run Code Online (Sandbox Code Playgroud)

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