批处理set字符串替换支持通配符吗?
微信文档每转发一次,便会复制一份,目录里有很多类似文本.docx
文本(1).docx
wenzi.xlsx
wenzi(1).xlsx
wenzi(2).xlsx
资料(3).pdf
这样的文件,想要去除后面的(1)(2)(3),用set字符串替换,但是发现好像不支持通配符
源代码如下,感觉有点笨:
@echo off
setlocal EnableDelayedExpansion
dir .\*.* /s /b|findstr "().*$">.\list.txt
for /f %%i in (.\list.txt) do (
set filefullname=%%i
set filepath=%%~dpi
set filename=%%~ni
set fileext=%%~xi
set newfilename=!filename!!fileext!
call :ren
)
del .\list.txt
exit
:ren
set "newfilename=%newfilename:(1)=%"
set "newfilename=%newfilename:(2)=%"
set "newfilename=%newfilename:(3)=%"
set "newfilename=%newfilename:(4)=%"
set "newfilename=%newfilename:(5)=%"
set "newfilename=%newfilename:(6)=%"
set "newfilename=%newfilename:(7)=%"
set "newfilename=%newfilename:(8)=%"
if not exist "%filepath%%newfilename%" (
rename "%filefullname%" "%newfilename%"
) else (
del "%filefullname%"
)
goto:eof
假如括号里是(100)那我不得写一百行??
恳请指点
set "newfilename=%newfilename:()=%"
set "newfilename=%newfilename:(?)=%"
都不行 括号有空格的哇,这个还要考虑到。 FOR /L %variable IN (start,step,end) DO command
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
请按任意键继续. . . 窄口牛 发表于 2022-10-20 15:49
括号有空格的哇,这个还要考虑到。
空格好办,加一行替换掉空格即可 szwp 发表于 2022-10-20 16:01
FOR /L %variable IN (start,step,end) DO command
该集表示以增量形式从开始 ...
这样是可以,感觉代码更复杂了 wjgyz740526 发表于 2022-10-20 16:01
空格好办,加一行替换掉空格即可
文件名里可能本来就有空格。 wjgyz740526 发表于 2022-10-20 16:03
这样是可以,感觉代码更复杂了
用for处理就不需要打100条。
将分隔符设为()更容易,但要确定文件名里没有() 去除后面的(1)(2)(3)不就重名吗? aa 两个循环就可以搞定,显然没问题,但总觉得批处理对付特殊字符上没其他语言方便,起码VBS效率就高多了,同样也可以不安装任何环境就可以用 wjgyz740526 发表于 2022-10-20 14:41
set "newfilename=%newfilename:()=%"
set "newfilename=%newfilename:(?)=%"
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办 对CMD要求别太高 wxinchun92 发表于 2022-10-20 18:06
去除后面的(1)(2)(3)不就重名吗?
所以加了if not exist判断啊 527104427 发表于 2022-10-20 19:29
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办
微信大多数情况下就只是简单的文件复制 527104427 发表于 2022-10-20 19:29
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办
如果考虑修改的话,那就一个都不能删了 感谢分享 对于经常把用户手机或者电脑硬盘当垃圾回收站使的微信操作系统来说,几十G、几百G的数据建议还是使用微信自带清理或者第三方微信清理工具更靠谱,重复文件查找文件都不见得管多大用。
以下代码只是举例,楼主需要自己完善,我清理的方法是删除整个微信数据文件夹{:1_186:}
@echo off
pushd %~dp0
::文件名中只有一个()的情况
for /f "tokens=1* delims=(" %%a in ('dir "*(*).*" /s /b ^| findstr ') do echo;%%a%%~xb
pause
@echo off
setlocal enabledelayedexpansion
mode con cols=150 lines=52
pushd %~dp0
::考虑到文件名中会存在多个()的情况,局限:仅支持同目录下的重复文件
for /f "delims=" %%a in ('dir "*(*).*" /s /b ^| findstr ') do (
set "var=%%~na"
rem 用7z.exe计算文件名含有()的文件的sha256值
for /f "skip=8" %%b in ('7z.exe h -scrcsha256 "%%a"') do if not defined sha256a set "sha256a=%%b"
rem 在不含文件后缀的文件名中反向查找(,最多查找(9999),得到去掉文件名末尾()和一个空格的文件路径
for /l %%b in (-1 -1 -6) do if not defined filename if "!var:~%%b,1!"=="(" set "filename=!var:~0,%%b!"
if "!filename:~-1!"==" " set "filename=!filename:~0,-1!"
set "filepath=%%~dpa!filename!%%~xa"
if exist "!filepath!" (
rem 用7z.exe计算文件名末尾去掉()的文件的sha256值
for /f "skip=8" %%b in ('7z.exe h -scrcsha256 "!filepath!"') do if not defined sha256b set "sha256b=%%b"
if "!sha256a!"=="!sha256b!" echo del /f /q "%%a"
)
)
echo;
echo;
pause
@echo off
setlocal enabledelayedexpansion
mode con cols=150 lines=52
pushd %~dp0
echo;重复文件查找中...
echo;
echo;
echo;重复的文件列表>"%temp%\重复的文件列表.log"
for /f "skip=8 tokens=1,2*" %%a in ('7z.exe h -scrcsha256') do (
if exist "%~dp0%%c" (
if not defined %%a (
set %%a=%%c
) else (
(set %%a
echo;%%a %%c)>>"%temp%\重复的文件列表.log"
echo;删除重复文件: %%c
)
)
)
start "" notepad.exe "%temp%\重复的文件列表.log"
color 2f
pause
需要7z.exe支持 nttwqz 发表于 2022-10-22 17:08
对于经常把用户手机或者电脑硬盘当垃圾回收站使的微信操作系统来说,几十G、几百G的数据建议还是使用微信自 ...
你这个考虑了文件检验,比我的好
页:
[1]