标题: [文件操作] 批处理如何实现提取文件名中指定位数的数字来重命名文件? [打印本页]
作者: foreveriuu 时间: 2016-6-17 09:36 标题: 批处理如何实现提取文件名中指定位数的数字来重命名文件?
本帖最后由 pcl_test 于 2016-6-17 14:02 编辑
目录下大量的文件,文件名格式类似
我的文件1_12345678.zip
我的文件2_22342345.doc
34232345_又一个文件.chm
需要提取8位数字将文件更名,后缀不变
12345678.zip
22342345.doc
34232345.chm
作者: GNU 时间: 2016-6-17 13:18
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d ^| findstr "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"') do (
- for /f %%j in ('echo "%%~nxi" ^| grep -Po "\d{8}"') do (
- set "NewName=%%j%%~xi"
- )
- ren "%%i" "!NewName!"
- )
复制代码
作者: foreveriuu 时间: 2016-6-17 14:32
多谢楼上,grep是第三方命令,有没有不用第三方命令的办法呢?
作者: pcl_test 时间: 2016-6-17 15:02
第三方可用ren2
ren2 -f ".*(\d{8}).*(\..*)" "$1$2"
作者: 小程936 时间: 2016-6-17 21:21
考虑到set /a会自动忽略非数字,可用
set a=&set /a a=b
if "%a%" == "%b%" echo %b%是数字
作者: /zhqsystem/zhq 时间: 2016-6-17 23:35
水一个- @echo off&(color 0e&chcp 936&setlocal enabledelayedexpansion)2>nul
- for /f "delims=" %%i in ('dir/a-d/s/b/l/on ".\*.*"')do if /i not "%%~fi"=="%~f0" (
- set "name_="%%~ni""&&set "name=!name_:_=";"!"
- for %%j in (!name!)do (set "n=%%j"&set "num="
- for /l %%n in (0,1,8192)do if /i not "!n:~%%n,1!"=="" (
- for /l %%o in (0,1,9)do if /i "!n:~%%n,1!"=="%%o" set/a "num+=1"
- )
- if !num! gtr 7 ren "%%~fi" "%%~j%%~xi"
- )
- )
- pause
复制代码
作者: WHY 时间: 2016-6-19 01:23
- PowerShell -c "dir *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*.*|ren -newName{$_.Name -replace '.*?(\d{8}).*(\..+)$','$1$2'}"
复制代码
作者: ttszuo 时间: 2016-6-19 04:38
本帖最后由 ttszuo 于 2016-6-19 06:02 编辑
借用2楼的代码- @echo off
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d ^| findstr "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"') do (
- for /f "tokens=1,2 delims=^_" %%a in ('echo.%%~ni') do (
- echo.%%a|findstr /be "[0-9]*" >nul && move "%%~nxi" "%%a%%~xi"|| move "%%~nxi" "%%b%%~xi"
- )
- )
- pause
复制代码
也可以这个- @echo off
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d ^| findstr "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"') do (
- for /f "tokens=1,2 delims=^_" %%a in ('echo.%%~ni') do (
- if 1%%a gtr 99999999 (move "%%~nxi" "%%a%%~xi") else (move "%%~nxi" "%%b%%~xi")
- )
- )
- pause
复制代码
借用5楼的判断是否是数字- @echo off
- setlocal enabledelayedexpansion
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d ^| findstr "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"') do (
- for /f "tokens=1,2 delims=^_" %%a in ('echo.%%~ni') do (
- set /a num=%%a
- if "!num!"=="%%a" (move "%%~nxi" "%%a%%~xi") else (move "%%~nxi" "%%b%%~xi")
- )
- )
- pause
复制代码
作者: foreveriuu 时间: 2016-6-20 10:23
楼上的脚本可用,非常感谢,我用python写了个脚本- import os, os.path, re
-
- ress = re.compile('\d{8}')
-
- # 批量改名
- def batchrename(root):
- for parent,dirnames,filenames in os.walk(root):
- for name in filenames:
- if len(re.findall(ress, name))>0:
- ss=re.findall(ress, name)[0]
- print(os.path.join(parent, ss+name[name.rfind('.'):]))
- os.rename(os.path.join(parent, name), os.path.join(parent, ss+name[name.rfind('.'):]))
-
- if __name__ == '__main__':
- batchrename('.')
复制代码
作者: hzf1019 时间: 2016-6-20 22:45
楼上各位大大好厉害,菜鸟学习了~~
作者: pcl_test 时间: 2016-7-4 11:16
- //&cls&(dir /a-d/b |findstr "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]")|cscript -nologo -e:jscript "%~f0"&pause&exit
- while(!WScript.StdIn.AtEndOfStream){
- var f = (new ActiveXObject('Scripting.Filesystemobject')).GetFile(WScript.StdIn.ReadLine());
- var newname = f.Name.replace(/.*?(\d{8}).*(\.[^\.]+)$/, '$1$2');
- try{f.Name = newname}catch(e){}
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |