标题: [文件操作] [已解决]批处理删除隐藏文件时,目录名含有英文!怎么办 [打印本页]
作者: microsoft_yaw 时间: 2024-4-27 13:47 标题: [已解决]批处理删除隐藏文件时,目录名含有英文!怎么办
各位大佬好!
请问使用Bat批处理进行批量删除目录下指定文件(普通文件和只读隐藏文件)的时候,如果目录名称 或 路径含有英标的!特殊符号(此时开启了延迟变量扩展)
那么此时删除含有!特殊符号的目录内的普通/只读隐藏文件时,会返回 The system cannot find the file specified(系统找不到指定的文件)的错误
因为Bat程序会将路径中的!识别为命令,从而系统找不到指定文件。
我的代码如下:- @echo off & chcp 65001>nul & setlocal enabledelayedexpansion
-
- set "folder_path=%~dp0Working\%1"
- set "del_files_suffix_list=jpg txt url html"
-
- REM 删除普通文件中的123.jpg、*.txt、*.url、*.html
- for /f "delims=" %%i in ('dir /b /s /on "!folder_path!"') do (
- if "%%~nxi" equ "123.jpg" (echo. & echo Delete:%%i & del /s /q "%%i")
- for %%j in (!del_files_suffix_list!) do (
- if "%%~xi" neq ".jpg" (
- if "%%~xi" equ ".%%j" (echo. & echo Delete:%%i & del /s /q "%%i")
- )
- )
- REM 删除只读、隐藏文件中的*.jpg、*.txt、*.url、*.html
- for /f "delims=" %%i in ('dir /ar /ah /b /s /on "!folder_path!"') do (
- for %%j in (!del_files_suffix_list!) do (
- if "%%~xi" equ ".%%j" (echo. & echo Delete:%%i & del /ar /ah /s /q "%%i")
- )
- )
复制代码
结果返回:- Delete:D:\Quick_Access\Desktop\Picture-Tools\Working\100\123123\123.jpg
- The system cannot find the file specified.
复制代码
原目录名称为:123!123
---------------------------------
其它补充:
[1].部分二级目录名称含有外语(日语/韩语/英语),为了防止遍历时出现乱码,所以使用了chcp 65001
[2].第9行代码的写法,是因为需要删除只读隐藏文件的名称为全中文,接上点,由于使用了chcp 65001去适配外语目录名称,现在无法正常识别变量中的中文字符.为了防止删除普通文件和出现乱码的情况,所以添加了此代码(如有更好的方法,感谢大佬的贡献!)
---------------------------------
我的需求是:
[1].在目录名称含有!特殊符号下,删除指定的普通/只读隐藏文件(名称+后缀)
[2].在目录名称含有!特殊符号下,删除指定的普通/只读隐藏文件(后缀)
[3].尽可能的使用for循环完成操作(学习目的) - *重点*
---------------------------------
最后最后,感谢各位提供方案的大佬们!!!
作者: 77七 时间: 2024-4-27 14:09
楼主的代码有一些错误,还有一些不好理解的地方,不如直接描述下需求,重新写好了。
作者: microsoft_yaw 时间: 2024-4-27 14:18
回复 2# 77七
代码已简化,大致意思是,接收主Bat程序传递的参数%1(一级目录名称),使用dir遍历该路径所有文件,判断该遍历文件是否等于123.jpg,如果等于则删除,现在的问题是目录名称中含有英文!特殊符号,使用del 删除文件时,结果返回找不到指定文件
作者: 77七 时间: 2024-4-27 14:26
回复 3# microsoft_yaw
- @echo off & chcp 65001 >nul
-
- set "folder_path=%~dp0Working\%1"
- set "del_files_suffix_list=jpg txt url html"
-
- del /s /q "%folder_path%\123.jpg"
- pause
复制代码
作者: microsoft_yaw 时间: 2024-4-27 14:50
回复 4# 77七
可是我需要批量处理呀,延迟变量扩展和for循环是不可缺的
作者: czjt1234 时间: 2024-4-27 14:57
ENDLOCAL
del 111!222\123.jpg
SETLOCAL ENABLEDELAYEDEXPANSION
作者: 77七 时间: 2024-4-27 15:19
回复 5# microsoft_yaw
4楼代码就是批量处理,先dir ,再判断是否等于,再删除,属于多此一举。
作者: microsoft_yaw 时间: 2024-4-27 16:26
回复 7# 77七
第一次发帖,有些遗漏,已补充,不好意思
作者: 77七 时间: 2024-4-27 17:44
回复 8# microsoft_yaw
现在的代码为什么还会用到 setlocal enabledelayedexpansion 呢
作者: terse 时间: 2024-4-27 17:49
有没有试过在FOR里开启延迟
作者: microsoft_yaw 时间: 2024-4-27 17:54
回复 9# 77七
使用for循环不需要开启延迟变量扩展吗?
作者: 77七 时间: 2024-4-27 18:02
回复 11# microsoft_yaw
不是必须。
作者: microsoft_yaw 时间: 2024-4-27 18:05
回复 12# 77七
我知道可以直接使用del /s /q 和 del /ar /ah /s /q 删除指定文件,但我想了解学习一下for如何解决这种情况(目录名称含有!特殊符号)
作者: 77七 时间: 2024-4-27 18:23
回复 13# microsoft_yaw
- @echo off & chcp 65001 >nul
-
- set "folder_path=%~dp0Working\%1"
-
- for /f "delims=" %%i in ('dir /b /s /a-d "%folder_path%\*.jpg"') do (
- set str=%%i
- setlocal enabledelayedexpansion
- echo !str!
- endlocal
- )
- pause
复制代码
开就是这样,也可以不开
作者: microsoft_yaw 时间: 2024-4-27 18:35
本帖最后由 microsoft_yaw 于 2024-4-27 19:17 编辑
回复 14# 77七
大佬,这样子如何?- @echo off & chcp 65001>nul & setlocal enabledelayedexpansion
-
- set "del_files_list=123.jpg *.txt *.url *.html"
-
- for %%i in (!del_files_list!) do (del /s /q "%folder_path%\%%i")
- del /ar /ah /s /q "%folder_path%\*"
复制代码
这个代码还没有尝试,应该可以去除setlocal enabledelayedexpansion
作者: 77七 时间: 2024-4-27 19:33
回复 15# microsoft_yaw
- @echo off & chcp 65001>nul
- set "folder_path=%~dp0Working\%1"
-
- REM 删除普通文件中的123.jpg、*.txt、*.url、*.html
- del /s /q "%folder_path%\123.jpg"
- for %%a in (txt url html) do (
- del /s /q "%folder_path%\*.%%a"
- )
-
- REM 删除只读、隐藏文件中的*.jpg、*.txt、*.url、*.html
- for %%a in (jpg txt url html) do (
- del /s /q /ar "%folder_path%\*.%%a"
- del /s /q /ah "%folder_path%\*.%%a"
- )
- pause
复制代码
作者: aloha20200628 时间: 2024-4-30 23:17
本帖最后由 aloha20200628 于 2024-4-30 23:31 编辑
开启变量延迟后,字符串变量无论是否被双引号包裹,其中的!字符都会被系统转义求值,除非!字符已用转义方法处理。
删除只读文件须用 /f 参数
再给一个保留for句式的简化版...- @echo off
- pushd "%~dp0Working\%~1"
- for %%m in (" ", "/ah") do (del /s /f /q %%~m 123.jpg *.txt *.url *.html)>nul 2>nul
- popd&pause&exit/b
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |