Board logo

标题: [文件操作] 批处理如何实现提取文件名中指定位数的数字来重命名文件? [打印本页]

作者: 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

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. 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 (
  4.     for /f %%j in ('echo "%%~nxi" ^| grep -Po "\d{8}"') do (
  5.         set "NewName=%%j%%~xi"
  6.     )
  7.     ren "%%i" "!NewName!"
  8. )
复制代码

作者: 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

水一个
  1. @echo off&(color 0e&chcp 936&setlocal enabledelayedexpansion)2>nul
  2. for /f "delims=" %%i in ('dir/a-d/s/b/l/on ".\*.*"')do if /i not "%%~fi"=="%~f0" (
  3. set "name_="%%~ni""&&set "name=!name_:_=";"!"
  4. for %%j in (!name!)do (set "n=%%j"&set "num="
  5.   for /l %%n in (0,1,8192)do if /i not "!n:~%%n,1!"=="" (
  6.    for /l %%o in (0,1,9)do if /i "!n:~%%n,1!"=="%%o" set/a "num+=1"
  7.   )
  8.   if !num! gtr 7 ren "%%~fi" "%%~j%%~xi"
  9. )
  10. )
  11. pause
复制代码

作者: WHY    时间: 2016-6-19 01:23

  1. 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楼的代码
  1. @echo off
  2. cd /d "%~dp0"
  3. 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 (
  4.     for /f "tokens=1,2 delims=^_" %%a in ('echo.%%~ni') do (
  5.         echo.%%a|findstr /be "[0-9]*" >nul && move "%%~nxi" "%%a%%~xi"|| move "%%~nxi" "%%b%%~xi"
  6.     )
  7. )
  8. pause
复制代码
也可以这个
  1. @echo off
  2. cd /d "%~dp0"
  3. 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 (
  4.     for /f "tokens=1,2 delims=^_" %%a in ('echo.%%~ni') do (
  5.         if 1%%a gtr 99999999 (move "%%~nxi" "%%a%%~xi")  else (move "%%~nxi" "%%b%%~xi")
  6.     )
  7. )
  8. pause
复制代码
借用5楼的判断是否是数字
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. 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 (
  5.     for /f "tokens=1,2 delims=^_" %%a in ('echo.%%~ni') do (
  6.             set /a num=%%a
  7.            if "!num!"=="%%a" (move "%%~nxi" "%%a%%~xi")  else (move "%%~nxi" "%%b%%~xi")
  8.     )
  9. )
  10. pause
复制代码

作者: foreveriuu    时间: 2016-6-20 10:23

楼上的脚本可用,非常感谢,我用python写了个脚本
  1. import os, os.path, re
  2. ress = re.compile('\d{8}')
  3. # 批量改名
  4. def batchrename(root):
  5.     for parent,dirnames,filenames in os.walk(root):
  6.         for name in filenames:
  7.             if len(re.findall(ress, name))>0:
  8.                 ss=re.findall(ress, name)[0]
  9.                 print(os.path.join(parent, ss+name[name.rfind('.'):]))
  10.                 os.rename(os.path.join(parent, name), os.path.join(parent, ss+name[name.rfind('.'):]))
  11. if __name__ == '__main__':      
  12.     batchrename('.')
复制代码

作者: hzf1019    时间: 2016-6-20 22:45

楼上各位大大好厉害,菜鸟学习了~~
作者: pcl_test    时间: 2016-7-4 11:16

  1. //&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
  2. while(!WScript.StdIn.AtEndOfStream){
  3.     var f = (new ActiveXObject('Scripting.Filesystemobject')).GetFile(WScript.StdIn.ReadLine());
  4.     var newname = f.Name.replace(/.*?(\d{8}).*(\.[^\.]+)$/, '$1$2');
  5.     try{f.Name = newname}catch(e){}
  6. }
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2