无忧启动论坛

标题: 批处理判断文件夹是否为目录链接 [打印本页]

作者: jxyun99    时间: 2022-10-23 21:31
标题: 批处理判断文件夹是否为目录链接
想通过批处理判断某文件夹是否为目录链接,网上找了一段代码,但是却无法实现,不明白问题出在哪里?有大神指点一下么?

代码如下
@echo on &pushd %~dp0
setlocal enabledelayedexpansion
for /f "eol=# skip=1 delims=; tokens=1,2" %%i in (config.txt) do (
        for %%A in ("%%i") do set attribs=%%~aA
        if "%attribs:~8,-2%" == "l" echo This is a symlink/junction
)

其中config.txt的内容为

说明行
C:\linkPath;K:\targetPath
C:\linkPath2;K:\targetPath2
C:\linkPath3;K:\targetPath3

作者: hua_wuxin    时间: 2022-10-23 21:49
%attribs:~8,-2%改为!attribs:~8,-2!看看
作者: jxyun99    时间: 2022-10-23 21:57
hua_wuxin 发表于 2022-10-23 21:49
%attribs:~8,-2%改为!attribs:~8,-2!看看

试过,不行的,感觉可能是变量延迟的问题,但不知道如何处理
作者: junyee    时间: 2022-10-23 22:12
这么麻烦干嘛。

'dir /AL'

作者: hua_wuxin    时间: 2022-10-23 22:26
本帖最后由 hua_wuxin 于 2022-10-23 22:29 编辑

建议考虑4楼的方法。

你原来的代码想改对的话:
setlocal enabledelayedexpansion
for /f "eol=# delims=; tokens=1,2" %%i in (config.txt) do (
  for %%A in ("%%i") do (
    set attribs=%%~aA
    if "!attribs:~8,-2!" == "l" (
      echo "%%i" is a symlink/junction
    ) else (
      echo "%%i" is not a symlink/junction
    )
  )
)





作者: 超逸绝尘    时间: 2022-10-23 22:27
这个看起来还是非常专业的,看看大佬们的解决方案
作者: jxyun99    时间: 2022-10-23 22:37
junyee 发表于 2022-10-23 22:12
这么麻烦干嘛。

'dir /AL'

这个代码怎么用??
作者: szwp    时间: 2022-10-24 08:35
jxyun99 发表于 2022-10-23 22:37
这个代码怎么用??

去CMD,将结果贴上来看看。
作者: jxyun99    时间: 2022-10-24 09:42
szwp 发表于 2022-10-24 08:35
去CMD,将结果贴上来看看。

在cmd运行了一下,他只能显示出当前文件夹下哪些文件是目录链接,但无法直接告诉我某个文件夹是否目录链接,比如我要判断C:\linkPath这个文件夹是目录链接还是普通文件夹?,这个代码不能直接实现吧
作者: jxyun99    时间: 2022-10-24 09:45
如果单纯的只是想知道电脑上有哪些文件夹是目录链接,windows下都可以直接用NTFSLinksView了,个人目的不是要知道有哪些目录链接,而是给它一个文件,要让批处理判断这个文件夹是否是目录链接,是的话运行代码,不是的话再运行其他代码
作者: szwp    时间: 2022-10-24 09:53
jxyun99 发表于 2022-10-24 09:42
在cmd运行了一下,他只能显示出当前文件夹下哪些文件是目录链接,但无法直接告诉我某个文件夹是否目录链 ...

dir /AL C:\linkPath*
将结果贴上来会么?
作者: szwp    时间: 2022-10-24 09:55
jxyun99 发表于 2022-10-24 09:45
如果单纯的只是想知道电脑上有哪些文件夹是目录链接,windows下都可以直接用NTFSLinksView了,个人目的不是 ...

给它一个文件,判断所在目录?
作者: cao8mm    时间: 2022-10-24 10:12
看看大佬们的解决方案
作者: sunsea    时间: 2022-10-24 10:12
本帖最后由 sunsea 于 2022-10-24 10:18 编辑
  1. @echo off
  2. pushd "%~dp0"
  3. setlocal enabledelayedexpansion

  4. for /f "eol=# skip=1 delims=; tokens=1,2" %%i in (config.txt) do (
  5.         set founded=0
  6.         call :judge %%i
  7.         if ERRORLEVEL 1 此处做你想要做的事情
  8. )
  9. goto :eof

  10. :judge
  11. set founded=0
  12. pushd "%1"
  13. pushd "../"
  14. for /f "delims=" %%k in ('dir /ADL /b') do if /i "%%k"=="%~n1" set founded=1
  15. popd
  16. popd
  17. exit /b !founded!
复制代码

建议小规模测试
作者: jxyun99    时间: 2022-10-24 10:49
sunsea 发表于 2022-10-24 10:12
建议小规模测试

运行版主的代码,路径下明明有文件夹,但是提示找不到

2022-10-24_104716.png (26.41 KB, 下载次数: 174)

2022-10-24_104716.png

作者: jxyun99    时间: 2022-10-24 13:28
szwp 发表于 2022-10-24 09:53
dir /AL C:\linkPath*
将结果贴上来会么?

dir的方式有瑕疵,比如我同一个目录下有linkPath(普通目录)和linkPath999(JUNCTION目录),这时候如果用dir来显示,就会出现错乱的情况。
dir /AL "C:\wen jian jia\linkPath"*
结果却会是显示的linkPath999属性,因为inkPath*匹配到了inkPath999

9999999999999.png (22.18 KB, 下载次数: 218)

9999999999999.png

作者: singel    时间: 2022-10-24 13:43
  1. @echo off
  2. pushd "%~dp0"
  3. setlocal enabledelayedexpansion

  4. rem 根据文件夹属性判断是否为目录链接
  5. for /f "eol=# skip=1 delims=; tokens=1,2" %%a in (config.txt) do (
  6.         set "lp=%%a"
  7.         if exist "!lp!" (
  8.                 for %%i in ("!lp!") do (
  9.                         set attribs=%%~ai
  10.                         if not "!attribs:~-3,-2!"=="l" (echo "!lp!"不是目录链接) else (echo "!lp!"是目录链接)
  11.                         )
  12.         )
  13. )
  14. pause
  15. exit
复制代码

作者: szwp    时间: 2022-10-24 13:46
jxyun99 发表于 2022-10-24 13:28
dir的方式有瑕疵,比如我同一个目录下有linkPath(普通目录)和linkPath999(JUNCTION目录),这时候如果用 ...

可以对结果判断啊,加 /b

作者: szwp    时间: 2022-10-24 13:49
jxyun99 发表于 2022-10-24 13:28
dir的方式有瑕疵,比如我同一个目录下有linkPath(普通目录)和linkPath999(JUNCTION目录),这时候如果用 ...

去14楼,看16行,学习if
作者: sunsea    时间: 2022-10-24 14:03
本帖最后由 sunsea 于 2022-10-24 14:07 编辑
jxyun99 发表于 2022-10-24 10:49
运行版主的代码,路径下明明有文件夹,但是提示找不到
  1. @echo off
  2. pushd "%~dp0"
  3. setlocal enabledelayedexpansion

  4. for /f "delims=; tokens=1,2" %%i in (config.txt) do (
  5.         call :judge "%%i"
  6.         if ERRORLEVEL 1 此处做你想做的事情
  7. )
  8. pause
  9. goto :eof

  10. :judge
  11. set founded=0
  12. pushd %1
  13. pushd "../"
  14. for /f "delims=" %%k in ('dir /ADL /b') do if /i "%%k"=="%~n1" set founded=1
  15. popd
  16. popd
  17. exit /b !founded!
复制代码

是空格处理的问题。以及config.txt里每个目录名字结尾后面不要加“\”。

这下应该可以了。

作者: jxyun99    时间: 2022-10-24 14:07
singel 发表于 2022-10-24 13:43

感谢,测试成功
作者: jxyun99    时间: 2022-10-24 14:07
sunsea 发表于 2022-10-24 14:03
是空格处理的问题。

这下应该可以了。

多谢版主,热心
作者: 窄口牛    时间: 2022-10-24 16:20
有个专门的第三方命令,可以判断链接。




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3