无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5288|回复: 22

批处理判断文件夹是否为目录链接

[复制链接]
发表于 2022-10-23 21:31:16 | 显示全部楼层 |阅读模式
想通过批处理判断某文件夹是否为目录链接,网上找了一段代码,但是却无法实现,不明白问题出在哪里?有大神指点一下么?

代码如下
@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
发表于 2022-10-23 21:49:31 | 显示全部楼层
%attribs:~8,-2%改为!attribs:~8,-2!看看

点评

试过,不行的,感觉可能是变量延迟的问题,但不知道如果处理  详情 回复 发表于 2022-10-23 21:57
回复

使用道具 举报

 楼主| 发表于 2022-10-23 21:57:09 | 显示全部楼层
hua_wuxin 发表于 2022-10-23 21:49
%attribs:~8,-2%改为!attribs:~8,-2!看看

试过,不行的,感觉可能是变量延迟的问题,但不知道如何处理
回复

使用道具 举报

发表于 2022-10-23 22:12:52 | 显示全部楼层
这么麻烦干嘛。

'dir /AL'

点评

这个代码怎么用??  详情 回复 发表于 2022-10-23 22:37
回复

使用道具 举报

发表于 2022-10-23 22:26:41 | 显示全部楼层
本帖最后由 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:27 | 显示全部楼层
这个看起来还是非常专业的,看看大佬们的解决方案
回复

使用道具 举报

 楼主| 发表于 2022-10-23 22:37:39 | 显示全部楼层
junyee 发表于 2022-10-23 22:12
这么麻烦干嘛。

'dir /AL'

这个代码怎么用??

点评

去CMD,将结果贴上来看看。  详情 回复 发表于 2022-10-24 08:35
回复

使用道具 举报

发表于 2022-10-24 08:35:18 | 显示全部楼层
jxyun99 发表于 2022-10-23 22:37
这个代码怎么用??

去CMD,将结果贴上来看看。

点评

在cmd运行了一下,他只能显示出当前文件夹下哪些文件是目录链接,但无法直接告诉我某个文件夹是否目录链接,比如我要判断C:\linkPath这个文件夹是目录链接还是普通文件夹?,这个代码不能直接实现吧  详情 回复 发表于 2022-10-24 09:42
回复

使用道具 举报

 楼主| 发表于 2022-10-24 09:42:00 | 显示全部楼层
szwp 发表于 2022-10-24 08:35
去CMD,将结果贴上来看看。

在cmd运行了一下,他只能显示出当前文件夹下哪些文件是目录链接,但无法直接告诉我某个文件夹是否目录链接,比如我要判断C:\linkPath这个文件夹是目录链接还是普通文件夹?,这个代码不能直接实现吧

点评

dir /AL C:\linkPath* 将结果贴上来会么?  详情 回复 发表于 2022-10-24 09:53
回复

使用道具 举报

 楼主| 发表于 2022-10-24 09:45:14 | 显示全部楼层
如果单纯的只是想知道电脑上有哪些文件夹是目录链接,windows下都可以直接用NTFSLinksView了,个人目的不是要知道有哪些目录链接,而是给它一个文件,要让批处理判断这个文件夹是否是目录链接,是的话运行代码,不是的话再运行其他代码

点评

给它一个文件,判断所在目录?  详情 回复 发表于 2022-10-24 09:55
回复

使用道具 举报

发表于 2022-10-24 09:53:03 | 显示全部楼层
jxyun99 发表于 2022-10-24 09:42
在cmd运行了一下,他只能显示出当前文件夹下哪些文件是目录链接,但无法直接告诉我某个文件夹是否目录链 ...

dir /AL C:\linkPath*
将结果贴上来会么?

点评

dir的方式有瑕疵,比如我同一个目录下有linkPath(普通目录)和linkPath999(JUNCTION目录),这时候如果用dir来显示,就会出现错乱的情况。 dir /AL "C:\wen jian jia\linkPath"* 结果却会是显示的linkPath999属性  详情 回复 发表于 2022-10-24 13:28
回复

使用道具 举报

发表于 2022-10-24 09:55:56 | 显示全部楼层
jxyun99 发表于 2022-10-24 09:45
如果单纯的只是想知道电脑上有哪些文件夹是目录链接,windows下都可以直接用NTFSLinksView了,个人目的不是 ...

给它一个文件,判断所在目录?
回复

使用道具 举报

发表于 2022-10-24 10:12:39 | 显示全部楼层
看看大佬们的解决方案
回复

使用道具 举报

发表于 2022-10-24 10:12:55 | 显示全部楼层
本帖最后由 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!
复制代码

建议小规模测试

点评

运行版主的代码,路径下明明有文件夹,但是提示找不到  详情 回复 发表于 2022-10-24 10:49
回复

使用道具 举报

 楼主| 发表于 2022-10-24 10:49:01 | 显示全部楼层
sunsea 发表于 2022-10-24 10:12
建议小规模测试

运行版主的代码,路径下明明有文件夹,但是提示找不到
2022-10-24_104716.png

点评

是空格处理的问题。 这下应该可以了。 [attachimg]510194[/attachimg]  详情 回复 发表于 2022-10-24 14:03
回复

使用道具 举报

 楼主| 发表于 2022-10-24 13:28:06 | 显示全部楼层
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

点评

去14楼,看16行,学习if  详情 回复 发表于 2022-10-24 13:49
可以对结果判断啊,加 /b  详情 回复 发表于 2022-10-24 13:46
回复

使用道具 举报

发表于 2022-10-24 13:43:02 | 显示全部楼层
  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
复制代码

点评

感谢,测试成功  详情 回复 发表于 2022-10-24 14:07
回复

使用道具 举报

发表于 2022-10-24 13:46:34 | 显示全部楼层
jxyun99 发表于 2022-10-24 13:28
dir的方式有瑕疵,比如我同一个目录下有linkPath(普通目录)和linkPath999(JUNCTION目录),这时候如果用 ...

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

使用道具 举报

发表于 2022-10-24 13:49:27 | 显示全部楼层
jxyun99 发表于 2022-10-24 13:28
dir的方式有瑕疵,比如我同一个目录下有linkPath(普通目录)和linkPath999(JUNCTION目录),这时候如果用 ...

去14楼,看16行,学习if
回复

使用道具 举报

发表于 2022-10-24 14:03:23 | 显示全部楼层
本帖最后由 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里每个目录名字结尾后面不要加“\”。

这下应该可以了。
111111.png

点评

多谢版主,热心  详情 回复 发表于 2022-10-24 14:07
回复

使用道具 举报

 楼主| 发表于 2022-10-24 14:07:05 | 显示全部楼层

感谢,测试成功
回复

使用道具 举报

 楼主| 发表于 2022-10-24 14:07:26 | 显示全部楼层
sunsea 发表于 2022-10-24 14:03
是空格处理的问题。

这下应该可以了。

多谢版主,热心
回复

使用道具 举报

发表于 2022-10-24 16:20:51 来自手机 | 显示全部楼层
有个专门的第三方命令,可以判断链接。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-16 04:51

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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