找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31335|回复: 10

[文件操作] [已解决]批处理如何判断是文件还是文件夹、是否是符号链接?

[复制链接]
发表于 2021-9-22 01:33:30 | 显示全部楼层 |阅读模式
本帖最后由 cntanglang 于 2021-10-4 22:55 编辑

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


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

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

——————————————————————————
已解决,具体见 4楼,感谢 Batcher 大神!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2021-9-22 08:58: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
复制代码
 楼主| 发表于 2021-9-22 09:11:03 | 显示全部楼层
本帖最后由 cntanglang 于 2021-9-22 09:14 编辑

回复 2# Batcher


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


    因为
    Dir 目录

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

    Dir 文件

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


    这导致,如果是一个有效目录或有效符号链接目录,都会返回其子目录信息,无法区别是不是符号链接目录。
发表于 2021-9-23 16:38:18 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +2 收起 理由
cntanglang + 2 乐于助人

查看全部评分

发表于 2021-9-25 21:38:30 | 显示全部楼层
用type能不能行?
发表于 2021-9-26 10:17:43 | 显示全部楼层
回复 5# gcbgczhang

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

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

另外你判断的作用是什么?如果不是符号链接,
 楼主| 发表于 2021-9-27 13:19:31 | 显示全部楼层
回复  cntanglang
Batcher 发表于 2021-9-23 16:38



    亲测可行,学到了,感谢感谢 :handshake
发表于 2021-9-27 14:44:58 | 显示全部楼层
回复 6# 极品小猫


    方案1是行不通的,你尝试写一写就发现问题了
发表于 2021-9-29 09:37:28 | 显示全部楼层
本帖最后由 极品小猫 于 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



只是这个方案无法细化到这是什么“链接”
发表于 2021-9-29 21:07:56 | 显示全部楼层
回复 9# 极品小猫


    是的 dir + findstr 的方案无法满足楼主的需求
发表于 2023-8-13 10:43:29 | 显示全部楼层
我用 everything 软件 查看所有链接
  1. ext:desklink;mapimail;mydocs;lnk;pif;scf;url;ZFSendToTarget|attrib:DL|<attributes:AL !attributes:P>|<attrib:RD child:target.lnk>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 14:32 , Processed in 0.024067 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表