[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理如何实现提取文件名中指定位数的数字来重命名文件?

本帖最后由 pcl_test 于 2016-6-17 14:02 编辑

目录下大量的文件,文件名格式类似
我的文件1_12345678.zip
我的文件2_22342345.doc
34232345_又一个文件.chm

需要提取8位数字将文件更名,后缀不变
12345678.zip
22342345.doc
34232345.chm

  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. )
复制代码

TOP

多谢楼上,grep是第三方命令,有没有不用第三方命令的办法呢?

TOP

第三方可用ren2
ren2 -f ".*(\d{8}).*(\..*)" "$1$2"

TOP

考虑到set /a会自动忽略非数字,可用
set a=&set /a a=b
if "%a%" == "%b%" echo %b%是数字

TOP

水一个
  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
复制代码
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

  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'}"
复制代码

TOP

本帖最后由 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
复制代码

TOP

楼上的脚本可用,非常感谢,我用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('.')
复制代码

TOP

楼上各位大大好厉害,菜鸟学习了~~

TOP

  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. }
复制代码

TOP

返回列表