Board logo

标题: [文件操作] [已解决]批处理如何判断是文件还是文件夹、是否是符号链接? [打印本页]

作者: cntanglang    时间: 2021-9-22 01:33     标题: [已解决]批处理如何判断是文件还是文件夹、是否是符号链接?

本帖最后由 cntanglang 于 2021-10-4 22:55 编辑

一个目录下有文件、也有文件夹、也有符号链接的文件、也有符号链接的文件夹
使用DIR 可以看出它们的不同,如下图


可以看出:
dir1是普通文件夹
dir2是符号链接的文件夹
file1是普通文件
file2是符号链接的文件

请问:如何通过批处理快速判断一个给定的路径对象,到底是文件、还是文件夹、还是符号链接的文件、还是符号链接的文件夹?
例如给定 "C:\test\dir2" 则判断是符号链接的文件夹;给定 "C:\test\file1.txt" 则判断是普通文件。

——————————————————————————
已解决,具体见 4楼,感谢 Batcher 大神!
作者: Batcher    时间: 2021-9-22 08:58

回复 1# cntanglang
  1. @echo off
  2. if not exist "%~1" (
  3.     goto :end
  4. )
  5. dir "%~1" | findstr "<DIR>" >nul 2>&1
  6. if errorlevel 1 (
  7.     goto :CheckJunk
  8. ) else (
  9.     echo 文件夹
  10.     goto :end
  11. )
  12. :CheckJunk
  13. dir "%~1" | findstr "<JUNCTION>" >nul 2>&1
  14. if errorlevel 1 (
  15.     goto :CheckLink
  16. ) else (
  17.     echo 符号链接的文件夹
  18.     goto :end
  19. )
  20. :CheckLink
  21. dir "%~1" | findstr "<SYMLINK>" >nul 2>&1
  22. if errorlevel 1 (
  23.     echo 普通文件
  24. ) else (
  25.     echo 符号链接的文件
  26. )
  27. :end
  28. pause
复制代码

作者: cntanglang    时间: 2021-9-22 09:11

本帖最后由 cntanglang 于 2021-9-22 09:14 编辑

回复 2# Batcher


    我之前写的就是这样的逻辑。。。可是,如果是符号链接的文件夹,是无法通过这个判断的。


    因为
    Dir 目录

    返回的是这个目录下的子目录和文件的信息,而不是目录本身的信息

    Dir 文件

    返回的则是这个文件本身的信息


    这导致,如果是一个有效目录或有效符号链接目录,都会返回其子目录信息,无法区别是不是符号链接目录。
作者: Batcher    时间: 2021-9-23 16:38

回复 3# cntanglang
  1. @echo off
  2. set "TempFile=%temp%\FsutilTemp.txt"
  3. if not exist "%~1" (
  4.     echo 不存在 "%~1"
  5.     goto :end
  6. )
  7. pushd "%~1" 2>nul
  8. if errorlevel 1 (
  9.     goto :CheckFile
  10. ) else (
  11.     popd
  12.     goto :CheckFolder
  13. )
  14. :CheckFolder
  15. fsutil reparsepoint query "%~1" >"%TempFile%" 2>&1
  16. if errorlevel 1 (
  17.     echo 普通文件夹
  18. ) else (
  19.     goto :CheckJunkFolder
  20.     goto :end
  21. )
  22. :CheckJunkFolder
  23. for /f "skip=3 delims=" %%i in ('type "%TempFile%"') do (
  24.     if "%%i" equ "标记值: 装入点" (
  25.         echo 软链接的文件夹
  26.     ) else if "%%i" equ "标记值: 符号链接" (
  27.         echo 符号链接的文件夹
  28.     )
  29. )
  30. goto :end
  31. :CheckFile
  32. fsutil reparsepoint query "%~1" >"%TempFile%" 2>&1
  33. if errorlevel 1 (
  34.     echo 普通文件
  35. ) else (
  36.     goto :CheckJunkFile
  37. )
  38. goto :end
  39. :CheckJunkFile
  40. for /f "skip=3 delims=" %%i in ('fsutil reparsepoint query "%~1"') do (
  41.     if "%%i" equ "标记值: 装入点" (
  42.         echo 软链接的文件
  43.     ) else if "%%i" equ "标记值: 符号链接" (
  44.         echo 符号链接的文件
  45.     )
  46. )
  47. goto :end
  48. :end
  49. pause
复制代码

作者: gcbgczhang    时间: 2021-9-25 21:38

用type能不能行?
作者: 极品小猫    时间: 2021-9-26 10:17

回复 5# gcbgczhang

方案1:曲线救国,dir 无法查看当前路径是否为符号链接,那就返回到上一级目录去查看

方案2:使用fileinfo查看目录信息,但信息内容不够详细,只能区分是目录链接还是目录
http://www.ltr-data.se/opencode.html/,搜fileinfo

另外你判断的作用是什么?如果不是符号链接,
作者: cntanglang    时间: 2021-9-27 13:19

回复  cntanglang
Batcher 发表于 2021-9-23 16:38



    亲测可行,学到了,感谢感谢 :handshake
作者: Batcher    时间: 2021-9-27 14:44

回复 6# 极品小猫


    方案1是行不通的,你尝试写一写就发现问题了
作者: 极品小猫    时间: 2021-9-29 09:37

本帖最后由 极品小猫 于 2021-9-29 09:40 编辑

回复 8# Batcher

可操作吧?这里的操作首先需要假设目标路径有可能是链接文件
通过回到上一层路径dir获取目录信息,比较路径的文件名(目录名)
  1. for /f "tokens=3,4 delims= " %i in ('dir Android\..^|findstr /i Android') do @echo %i %j
复制代码
<JUNCTION> Android



只是这个方案无法细化到这是什么“链接”
作者: Batcher    时间: 2021-9-29 21:07

回复 9# 极品小猫


    是的 dir + findstr 的方案无法满足楼主的需求
作者: tiandyoin    时间: 2023-8-13 10:43

我用 everything 软件 查看所有链接
  1. ext:desklink;mapimail;mydocs;lnk;pif;scf;url;ZFSendToTarget|attrib:DL|<attributes:AL !attributes:P>|<attrib:RD child:target.lnk>
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2