Windows原生替代方案ln -s
是mklink
.
有什么本地替代品readlink
吗?或者如何本地识别文件是否是符号链接?
无需将标准输出重定向到 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
我不相信有任何工具直接等同于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%
因此没有第一个或最后一个字符的结果。