标题: [文本处理] 求助,批处理重命名图片文件名 [打印本页]
作者: qqnn666 时间: 2021-5-15 16:31 标题: 求助,批处理重命名图片文件名
我有一批图片文件,里面是以姓名身份证号码命名,我要修改成只剩余身份证号码,名字去除。(注有jpg、pn……各种格式),谢谢
作者: Batcher 时间: 2021-5-15 17:52
回复 1# qqnn666
请给两个真实的例子看看具体格式
作者: xp3000 时间: 2021-5-15 20:25
- @echo off&setlocal enabledelayedexpansion
- cd %~dp0
-
- for /f "delims=*" %%i in ('dir /b /ad /s *') do (
- setlocal
- pushd %%i
- for /f "delims=*" %%j in ('dir /a-d /b "*.jpg" "*.png" "*.bmp"') do (set f=%%~nj&set f=!f:~-18!
- ren "%%j" "!f!%%~xj"
- )
- endlocal
- popd
- )
- pause
复制代码
作者: qqnn666 时间: 2021-5-16 09:20
回复 2# Batcher
例:张三123456789012345678.jpg改成123456789012345678.jpg
作者: qqnn666 时间: 2021-5-16 09:25
回复 3# xp3000
谢谢,我复制进入运行后,显示按任意键继续,然后直接退出?图片未做修改。
作者: qqnn666 时间: 2021-5-16 10:09
回复 6# xp3000
可以了,另想问下,如果一堆文件夹里面(如新建文件夹、1、办公室……等)都有这些文件,也包含有TXT、xls、rar……等非图片文件,能否一起修改,不需要单独进行修改?谢谢!
作者: qixiaobin0715 时间: 2021-5-16 10:17
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b/s/a-d *.jpg *.png') do (
- set "str=%%~na"
- set "str=!str:~-18!"
- ren "%%a" "!str!%%~xa"
- )
- pause
复制代码
作者: qqnn666 时间: 2021-5-16 11:32
回复 9# qixiaobin0715
谢谢,不好意思,我没表达清楚,我的意思是,在一个大文件夹里面有很多小文件夹,小文件夹里面有相片也有其它文件(只需要修改相片文件,其它文件不改动),能否把一个大文件夹里面的所有相片(只是相片,其它自动跳过)(含小文件夹里的所有相片)批量修改?
谢谢
作者: Batcher 时间: 2021-5-16 21:13
回复 10# qqnn666
请举例说明9楼代码执行之后具体哪个地方没有达到你描述的需求?
作者: xp3000 时间: 2021-5-16 21:28
- @echo off
- for /f "delims=" %%a in ('more +6 "%0"') do (
- type nul>%%a
- )
- pause & exit /b
-
- :需要生成的文件在下面:
- 北京市 张三·000000000000000000.jpg
- 张三310117197005158411·上海市.png
- 张三钦州市 45070119830418326X .jpg.jpg.jpg.jpg
- 自贡市·510300197705179628张三.png.png
- 张三000000431103197605186731·永州市.jpg
复制代码
我的测试是按照这样生成的,但是代码遇到匹配不到的文件名内容部分会错误,不知道怎么屏蔽错误提示
作者: qqnn666 时间: 2021-5-17 13:39
我的测试是按照这样生成的,但是代码遇到匹配不到的文件名内容部分会错误,不知道怎么屏蔽错误提示
xp3000 发表于 2021-5-16 21:28
有一个有连字的和身份证号码报错
作者: qqnn666 时间: 2021-5-17 13:39
我的测试是按照这样生成的,但是代码遇到匹配不到的文件名内容部分会错误,不知道怎么屏蔽错误提示
xp3000 发表于 2021-5-16 21:28
显示连字和身份证号码还在
作者: xp3000 时间: 2021-5-17 14:29
我那还是删了算了,试水贴,在重复和不存在的捕获不到的身份证号码会有错误提示,虽说不影响效果,但是看着难受
作者: qqnn666 时间: 2021-5-17 14:29
回复 13# xp3000
请问可以怎么解决吗?
作者: xp3000 时间: 2021-5-18 09:15
不用match捕获,用replace替换方式可以解决,现在就是平年和闰年的识别了,达到100%身份证命名规则的识别,但是测试时候发生括弧不对称,单独拆开又正确
递归解决倒是可以解决,不是计算出来的闰年,递归有点浪费,解决了计算就单独发
作者: xp3000 时间: 2021-5-18 14:13
用的.*([1-9][0-9]{5}(19|20)[0-9]{2}(([0][13-9]|11|12)([0][1-9]|[12][0-9]|30)|([0][13578]|10|12)(31)|(02)([0][1-9]|1[0-9]|2[0-8]|29))[0-9]{3}[0-9X]).*替换分组1
根据计算的闰年平年对分组那里支持到2月28再加一个28+0和28+1的变量,或根据判断平年闰年分开执行不同命令,得到100%身份证命名规则,执行后得到效果是:- 身份证:431103197605186731的信息为闰年1976年出生,02月18日小于2月30天,即将重命名……
- ren "张三0000000000000431103197605186731000000000000·永州市.jpg" "431103197605186731.jpg"
-
- 身份证:310117197005158411的信息为平年1970年出生,02月15日小于2月29天,即将重命名……
- ren "张三1719700515841131011719700515841131014666432·上海市.png" "310117197005158411.png"
-
- 张三ZZZZ00000000000000000000000000000000000000000000.jpg :文件名不含中华人民共和国第二代身份证号命名规则
-
- 身份证:45070119830418326X的信息为平年1983年出生,02月18日小于2月29天,即将重命名……
- ren "张三钦州市 45070119830418326X76543248765457.jpg.jpg.jpg.jpg" "45070119830418326X.jpg"
-
- 身份证:510300197705179628的信息为平年1977年出生,02月17日小于2月29天,即将重命名……
- ren "自贡市·510300197705179628510300197705179628855张三.png.png" "510300197705179628.png"
-
- 请按任意键继续. . .
复制代码
刚开始计算平年闰年除4可以,同时整百时除400时候说括弧不对称,就是就卡这里的,后来发现是!必须要用^!,不然括弧不对称
作者: qixiaobin0715 时间: 2021-5-18 14:20
回复 17# xp3000
厉害!!!
作者: xp3000 时间: 2021-5-18 14:28
- @if(0)==(0) echo off&setlocal EnableDelayedExpansion
- for /f "delims=" %%j in ('dir /b/a-d/on "*.jpg" "*.png"') do (
- @for /f "delims=" %%k in ('echo %%~nj^|cscript -nologo -e:jscript "%~f0"') do (
- if "%%j" neq "%%k%%~xj" (
- set str=%%k&set year=!str:~6,4!&set day=!str:~12,2!
- set /a "y=^!(year%%4)&^!(^!(year%%100))|^!(year%%400)"
- set /a str=28+!y!&echo,身份证:%%k的信息为闰年!year!年出生,2月!str!天
- ) else (
- echo %%j :文件名不含中华人民共和国身份证号命名规则&echo.
- )
- )
- )
- pause & exit /b
- @end
-
- var objShell = new ActiveXObject('Shell.Application');
-
- while(!WScript.StdIn.AtEndOfStream) {
- var strFile = WScript.StdIn.ReadLine();
- var strFile = strFile.replace(/.*([1-9][0-9]{5}(19|20)[0-9]{2}(([0][13-9]|11|12)([0][1-9]|[12][0-9]|30)|([0][13578]|10|12)(31)|(02)([0][1-9]|1[0-9]|2[0-8]|29))[0-9]{3}[0-9X]).*/g, '$1');
- WSH.Echo(strFile);
- }
复制代码
气死了,我上午看见括弧不对称给删除,现在重写居然忘记了,,我也不怎么会弄JS,
作者: xp3000 时间: 2021-5-18 14:41
想起了来了,set day=!str:~12,2!,加个判断是否大于或小于等于str变量,对命名规则进行操作
作者: qixiaobin0715 时间: 2021-5-18 15:58
回复 18# xp3000
关于月份和日期的正则表达,也可以这样考虑:
1、3、5、7、8、10、12月有31号;除去2月都有30号;润2月及其它个月都会有1~29号。根据以上情况月份日期用正则表达式分3段表示如下。- (0[13578]|1[02])31|(0[13-9]|1[0-2])30|(0[1-9]|1[0-2])(0[1-9]|[12][0-9])
复制代码
作者: qixiaobin0715 时间: 2021-5-18 16:42
多选结构中,特殊的部分放在前面,有利于提高效率。
作者: xp3000 时间: 2021-5-18 17:14
谢谢,这样简洁
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |