无忧启动论坛

标题: 批处理set字符串替换支持通配符吗? [打印本页]

作者: wjgyz740526    时间: 2022-10-20 14:40
标题: 批处理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 "([0-9]).*$">.\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)那我不得写一百行??

恳请指点







作者: wjgyz740526    时间: 2022-10-20 14:41
set "newfilename=%newfilename:([0-9])=%"
set "newfilename=%newfilename:(?)=%"

都不行
作者: 窄口牛    时间: 2022-10-20 15:49
括号有空格的哇,这个还要考虑到。
作者: szwp    时间: 2022-10-20 16:01
FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
请按任意键继续. . .
作者: wjgyz740526    时间: 2022-10-20 16:01
窄口牛 发表于 2022-10-20 15:49
括号有空格的哇,这个还要考虑到。

空格好办,加一行替换掉空格即可
作者: wjgyz740526    时间: 2022-10-20 16:03
szwp 发表于 2022-10-20 16:01
FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始 ...

这样是可以,感觉代码更复杂了
作者: szwp    时间: 2022-10-20 16:18
wjgyz740526 发表于 2022-10-20 16:01
空格好办,加一行替换掉空格即可

文件名里可能本来就有空格。
作者: szwp    时间: 2022-10-20 16:20
wjgyz740526 发表于 2022-10-20 16:03
这样是可以,感觉代码更复杂了

用for处理就不需要打100条。
将分隔符设为()更容易,但要确定文件名里没有()
作者: wxinchun92    时间: 2022-10-20 18:06
去除后面的(1)(2)(3)不就重名吗?
作者: 3360788520    时间: 2022-10-20 18:45
aa
作者: 9zhmke    时间: 2022-10-20 19:16
两个循环就可以搞定,显然没问题,但总觉得批处理对付特殊字符上没其他语言方便,起码VBS效率就高多了,同样也可以不安装任何环境就可以用
作者: 527104427    时间: 2022-10-20 19:29
wjgyz740526 发表于 2022-10-20 14:41
set "newfilename=%newfilename:([0-9])=%"
set "newfilename=%newfilename:(?)=%"

这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办
作者: conlin888    时间: 2022-10-20 19:33
对CMD要求别太高
作者: wjgyz740526    时间: 2022-10-20 19:47
wxinchun92 发表于 2022-10-20 18:06
去除后面的(1)(2)(3)不就重名吗?

所以加了if not exist判断啊
作者: wjgyz740526    时间: 2022-10-20 19:48
527104427 发表于 2022-10-20 19:29
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办

微信大多数情况下就只是简单的文件复制
作者: wjgyz740526    时间: 2022-10-20 20:06
527104427 发表于 2022-10-20 19:29
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办

如果考虑修改的话,那就一个都不能删了
作者: Y--Y    时间: 2022-10-21 01:55
感谢分享
作者: nttwqz    时间: 2022-10-22 17:08
对于经常把用户手机或者电脑硬盘当垃圾回收站使的微信操作系统来说,几十G、几百G的数据建议还是使用微信自带清理或者第三方微信清理工具更靠谱,重复文件查找文件都不见得管多大用。


以下代码只是举例,楼主需要自己完善,我清理的方法是删除整个微信数据文件夹

  1. @echo off
  2. pushd %~dp0

  3. ::文件名中只有一个()的情况
  4. for /f "tokens=1* delims=(" %%a in ('dir "*(*).*" /s /b ^| findstr [0-9]') do echo;%%a%%~xb
  5. pause
复制代码

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. mode con cols=150 lines=52
  4. pushd %~dp0

  5. ::考虑到文件名中会存在多个()的情况,局限:仅支持同目录下的重复文件
  6. for /f "delims=" %%a in ('dir "*(*).*" /s /b ^| findstr [0-9]') do (
  7.     set "var=%%~na"
  8.     rem 用7z.exe计算文件名含有([0-9])的文件的sha256值
  9.     for /f "skip=8" %%b in ('7z.exe h -scrcsha256 "%%a"') do if not defined sha256a set "sha256a=%%b"
  10.     rem 在不含文件后缀的文件名中反向查找(,最多查找(9999),得到去掉文件名末尾([0-9])和一个空格的文件路径
  11.     for /l %%b in (-1 -1 -6) do if not defined filename if "!var:~%%b,1!"=="(" set "filename=!var:~0,%%b!"
  12.     if "!filename:~-1!"==" " set "filename=!filename:~0,-1!"
  13.     set "filepath=%%~dpa!filename!%%~xa"
  14.     if exist "!filepath!" (
  15.         rem 用7z.exe计算文件名末尾去掉([0-9])的文件的sha256值
  16.         for /f "skip=8" %%b in ('7z.exe h -scrcsha256 "!filepath!"') do if not defined sha256b set "sha256b=%%b"
  17.         if "!sha256a!"=="!sha256b!" echo del /f /q "%%a"
  18.     )
  19. )
  20. echo;
  21. echo;
  22. pause
复制代码


  1. @echo off
  2. setlocal enabledelayedexpansion
  3. mode con cols=150 lines=52
  4. pushd %~dp0

  5. echo;重复文件查找中...
  6. echo;
  7. echo;
  8. echo;重复的文件列表>"%temp%\重复的文件列表.log"
  9. for /f "skip=8 tokens=1,2*" %%a in ('7z.exe h -scrcsha256') do (
  10.     if exist "%~dp0%%c" (
  11.         if not defined %%a (
  12.             set %%a=%%c
  13.         ) else (
  14.             (set %%a
  15.             echo;%%a    %%c)>>"%temp%\重复的文件列表.log"
  16.             echo;删除重复文件: %%c
  17.         )
  18.     )
  19. )
  20. start "" notepad.exe "%temp%\重复的文件列表.log"
  21. color 2f
  22. pause
复制代码



作者: nttwqz    时间: 2022-10-22 17:10
需要7z.exe支持
作者: wjgyz740526    时间: 2022-10-23 07:42
nttwqz 发表于 2022-10-22 17:08
对于经常把用户手机或者电脑硬盘当垃圾回收站使的微信操作系统来说,几十G、几百G的数据建议还是使用微信自 ...

你这个考虑了文件检验,比我的好





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