无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 3019|回复: 19
打印 上一主题 下一主题

[求助] 批处理set字符串替换支持通配符吗?

[复制链接]
跳转到指定楼层
1#
发表于 2022-10-20 14:40:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微信文档每转发一次,便会复制一份,目录里有很多类似
文本.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)那我不得写一百行??

恳请指点






2#
 楼主| 发表于 2022-10-20 14:41:48 | 只看该作者
set "newfilename=%newfilename:([0-9])=%"
set "newfilename=%newfilename:(?)=%"

都不行

点评

这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办  详情 回复 发表于 2022-10-20 19:29
回复

使用道具 举报

3#
发表于 2022-10-20 15:49:40 来自手机 | 只看该作者
括号有空格的哇,这个还要考虑到。

点评

空格好办,加一行替换掉空格即可  详情 回复 发表于 2022-10-20 16:01
回复

使用道具 举报

4#
发表于 2022-10-20 16:01:48 | 只看该作者
FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
请按任意键继续. . .

点评

这样是可以,感觉代码更复杂了  详情 回复 发表于 2022-10-20 16:03
回复

使用道具 举报

5#
 楼主| 发表于 2022-10-20 16:01:58 来自手机 | 只看该作者
窄口牛 发表于 2022-10-20 15:49
括号有空格的哇,这个还要考虑到。

空格好办,加一行替换掉空格即可

点评

文件名里可能本来就有空格。  详情 回复 发表于 2022-10-20 16:18
回复

使用道具 举报

6#
 楼主| 发表于 2022-10-20 16:03:01 来自手机 | 只看该作者
szwp 发表于 2022-10-20 16:01
FOR /L %variable IN (start,step,end) DO command [command-parameters]

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

这样是可以,感觉代码更复杂了

点评

用for处理就不需要打100条。 将分隔符设为()更容易,但要确定文件名里没有()  详情 回复 发表于 2022-10-20 16:20
回复

使用道具 举报

7#
发表于 2022-10-20 16:18:41 | 只看该作者
wjgyz740526 发表于 2022-10-20 16:01
空格好办,加一行替换掉空格即可

文件名里可能本来就有空格。
回复

使用道具 举报

8#
发表于 2022-10-20 16:20:11 | 只看该作者
wjgyz740526 发表于 2022-10-20 16:03
这样是可以,感觉代码更复杂了

用for处理就不需要打100条。
将分隔符设为()更容易,但要确定文件名里没有()
回复

使用道具 举报

9#
发表于 2022-10-20 18:06:05 | 只看该作者
去除后面的(1)(2)(3)不就重名吗?

点评

所以加了if not exist判断啊  详情 回复 发表于 2022-10-20 19:47
回复

使用道具 举报

10#
发表于 2022-10-20 18:45:34 | 只看该作者
aa
回复

使用道具 举报

11#
发表于 2022-10-20 19:16:11 | 只看该作者
两个循环就可以搞定,显然没问题,但总觉得批处理对付特殊字符上没其他语言方便,起码VBS效率就高多了,同样也可以不安装任何环境就可以用
回复

使用道具 举报

12#
发表于 2022-10-20 19:29:13 | 只看该作者
wjgyz740526 发表于 2022-10-20 14:41
set "newfilename=%newfilename:([0-9])=%"
set "newfilename=%newfilename:(?)=%"

这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办

点评

如果考虑修改的话,那就一个都不能删了  详情 回复 发表于 2022-10-20 20:06
微信大多数情况下就只是简单的文件复制  详情 回复 发表于 2022-10-20 19:48
回复

使用道具 举报

13#
发表于 2022-10-20 19:33:09 来自手机 | 只看该作者
对CMD要求别太高
回复

使用道具 举报

14#
 楼主| 发表于 2022-10-20 19:47:02 来自手机 | 只看该作者
wxinchun92 发表于 2022-10-20 18:06
去除后面的(1)(2)(3)不就重名吗?

所以加了if not exist判断啊
回复

使用道具 举报

15#
 楼主| 发表于 2022-10-20 19:48:01 来自手机 | 只看该作者
527104427 发表于 2022-10-20 19:29
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办

微信大多数情况下就只是简单的文件复制
回复

使用道具 举报

16#
 楼主| 发表于 2022-10-20 20:06:22 来自手机 | 只看该作者
527104427 发表于 2022-10-20 19:29
这样不严谨吧,仅从文件名判断其是否重名?应该计算一下MD5才保险吧,万一删错怎么办

如果考虑修改的话,那就一个都不能删了
回复

使用道具 举报

17#
发表于 2022-10-21 01:55:04 | 只看该作者
感谢分享
回复

使用道具 举报

18#
发表于 2022-10-22 17:08:26 | 只看该作者
对于经常把用户手机或者电脑硬盘当垃圾回收站使的微信操作系统来说,几十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
复制代码


点评

你这个考虑了文件检验,比我的好  详情 回复 发表于 2022-10-23 07:42
回复

使用道具 举报

19#
发表于 2022-10-22 17:10:13 | 只看该作者
需要7z.exe支持
回复

使用道具 举报

20#
 楼主| 发表于 2022-10-23 07:42:16 来自手机 | 只看该作者
nttwqz 发表于 2022-10-22 17:08
对于经常把用户手机或者电脑硬盘当垃圾回收站使的微信操作系统来说,几十G、几百G的数据建议还是使用微信自 ...

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-30 05:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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