[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理删除隐藏文件时,目录名含有英文!怎么办

各位大佬好!
请问使用Bat批处理进行批量删除目录下指定文件(普通文件和只读隐藏文件)的时候,如果目录名称 或 路径含有英标的!特殊符号(此时开启了延迟变量扩展)
那么此时删除含有!特殊符号的目录内的普通/只读隐藏文件时,会返回 The system cannot find the file specified(系统找不到指定的文件)的错误
因为Bat程序会将路径中的!识别为命令,从而系统找不到指定文件。
我的代码如下:
  1. @echo off & chcp 65001>nul & setlocal enabledelayedexpansion
  2. set "folder_path=%~dp0Working\%1"
  3. set "del_files_suffix_list=jpg txt url html"
  4. REM 删除普通文件中的123.jpg、*.txt、*.url、*.html
  5. for /f "delims=" %%i in ('dir /b /s /on "!folder_path!"') do (
  6. if "%%~nxi" equ "123.jpg" (echo. & echo Delete:%%i & del /s /q "%%i")
  7. for %%j in (!del_files_suffix_list!) do (
  8. if "%%~xi" neq ".jpg" (
  9. if "%%~xi" equ ".%%j" (echo. & echo Delete:%%i & del /s /q "%%i")
  10. )
  11. )
  12. REM 删除只读、隐藏文件中的*.jpg、*.txt、*.url、*.html
  13. for /f "delims=" %%i in ('dir /ar /ah /b /s /on "!folder_path!"') do (
  14. for %%j in (!del_files_suffix_list!) do (
  15. if "%%~xi" equ ".%%j" (echo. & echo Delete:%%i & del /ar /ah /s /q "%%i")
  16. )
  17. )
复制代码
结果返回:
  1. Delete:D:\Quick_Access\Desktop\Picture-Tools\Working\100\123123\123.jpg
  2. The system cannot find the file specified.
复制代码
原目录名称为:123!123
---------------------------------
其它补充:
[1].部分二级目录名称含有外语(日语/韩语/英语),为了防止遍历时出现乱码,所以使用了chcp 65001
[2].第9行代码的写法,是因为需要删除只读隐藏文件的名称为全中文,接上点,由于使用了chcp 65001去适配外语目录名称,现在无法正常识别变量中的中文字符.为了防止删除普通文件和出现乱码的情况,所以添加了此代码(如有更好的方法,感谢大佬的贡献!)
---------------------------------
我的需求是:
[1].在目录名称含有!特殊符号下,删除指定的普通/只读隐藏文件(名称+后缀)
[2].在目录名称含有!特殊符号下,删除指定的普通/只读隐藏文件(后缀)
[3].尽可能的使用for循环完成操作(学习目的) - *重点*
---------------------------------
最后最后,感谢各位提供方案的大佬们!!!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

楼主的代码有一些错误,还有一些不好理解的地方,不如直接描述下需求,重新写好了。
bat小白,请多指教!谢谢!

TOP

回复 2# 77七


    代码已简化,大致意思是,接收主Bat程序传递的参数%1(一级目录名称),使用dir遍历该路径所有文件,判断该遍历文件是否等于123.jpg,如果等于则删除,现在的问题是目录名称中含有英文!特殊符号,使用del 删除文件时,结果返回找不到指定文件

TOP

回复 3# microsoft_yaw


  
  1. @echo off & chcp 65001 >nul
  2. set "folder_path=%~dp0Working\%1"
  3. set "del_files_suffix_list=jpg txt url html"
  4. del /s /q "%folder_path%\123.jpg"
  5. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 4# 77七


    可是我需要批量处理呀,延迟变量扩展和for循环是不可缺的

TOP

ENDLOCAL
del 111!222\123.jpg
SETLOCAL ENABLEDELAYEDEXPANSION

QQ 20147578

TOP

回复 5# microsoft_yaw


   4楼代码就是批量处理,先dir ,再判断是否等于,再删除,属于多此一举。
bat小白,请多指教!谢谢!

TOP

回复 7# 77七


    第一次发帖,有些遗漏,已补充,不好意思

TOP

回复 8# microsoft_yaw


   
现在的代码为什么还会用到 setlocal enabledelayedexpansion 呢
bat小白,请多指教!谢谢!

TOP

有没有试过在FOR里开启延迟

TOP

回复 9# 77七


    使用for循环不需要开启延迟变量扩展吗?

TOP

回复 11# microsoft_yaw


   
不是必须。
bat小白,请多指教!谢谢!

TOP

回复 12# 77七


    我知道可以直接使用del /s /q 和 del /ar /ah /s /q 删除指定文件,但我想了解学习一下for如何解决这种情况(目录名称含有!特殊符号)

TOP

回复 13# microsoft_yaw


  
  1. @echo off & chcp 65001 >nul
  2. set "folder_path=%~dp0Working\%1"
  3. for /f "delims=" %%i in ('dir /b /s /a-d "%folder_path%\*.jpg"') do (
  4.         set str=%%i
  5.         setlocal enabledelayedexpansion
  6.         echo !str!
  7.         endlocal
  8. )
  9. pause
复制代码
开就是这样,也可以不开
bat小白,请多指教!谢谢!

TOP

本帖最后由 microsoft_yaw 于 2024-4-27 19:17 编辑

回复 14# 77七

大佬,这样子如何?
  1. @echo off & chcp 65001>nul & setlocal enabledelayedexpansion
  2. set "del_files_list=123.jpg *.txt *.url *.html"
  3. for %%i in (!del_files_list!) do (del /s /q "%folder_path%\%%i")
  4. del /ar /ah /s /q "%folder_path%\*"
复制代码
这个代码还没有尝试,应该可以去除setlocal enabledelayedexpansion

TOP

返回列表