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

[文件操作] [已解决]批处理怎样批量将升级补丁的名字命名为KBxxxx.exe?

本帖最后由 consatan 于 2011-4-30 10:32 编辑

WINDOWS的补丁命名(从官网下)一般是
WindowsXP-KB12345-x86-CHS.exe
但有的并不是这格式,如
WindowsXP-KB2345-v2-x86-CHS.exe

WindowsXP-WindowsMedia-KB456789-v2-x86-CHS.exe
我想实现
将KB补丁都统一放在一个目录下,然后将它们批量重命名为
KB8位数字.exe
比如
WindowsXP-KB12345-x86-CHS.exe
希望重命名为
KB00012345.EXE
因为DIR无法对数字进行排序,比如234.exe会排在34.exe之前,所以要把它们都补齐8位数字
我的思路是
  1. @echo off && setlocal enableDelayedExpansion
  2. set "folderpath=C:\UPDATE\"
  3. set "tempfile=%TEMP%\updatefilelist.tmp"
  4. set "renbat=%folderpath%renbat.bat"
  5. dir %folderpath%*.exe /W/B/A-D>%tempfile%
  6. echo @echo off>%renbat%
  7. echo cd /d %folderpath%>>%renbat%
  8. for /f "tokens=*" %%a in (%tempfile%) do (
  9.   set fname=%%a
  10.   set fname=!fname:*-KB=KB!
  11.   set fname=!fname:~0,9!
  12.   if "!fname:~-1!"=="-" (
  13.     set "fname=KB00!fname:~2,-1!.exe"
  14.   ) else (
  15.     set "fname=KB0!fname:~2!.exe"
  16.   )
  17.   echo ren "%%a" "!fname!">>%renbat%
  18. )
  19. del /f/q %tempfile%
  20. call %renbat%
复制代码
但这方法没有实现
文件名中没有KB字样,则不重命名
我下载的文件,KB后面至少带6个数字,如果是遇到带5个或者更少,或者8、9个数字的,那这方法也无法变通
如果是正则表达式的话,倒是可以用捕获组来实现
  1. /^.*-KB(\d+)-.*.exe/ig
复制代码
为了便于测试,下面是我C:\UPDATE下的文件列表
WindowsXP-KB898461-x86-CHS.exe
WindowsXP-KB951376-v2-x86-CHS.exe
WindowsXP-WindowsMedia-KB973540-x86-CHS.exe
WindowsXP-WindowsMedia-KB954155-x86-CHS.exe
WindowsXP-WindowsMedia-KB952069-v2-x86-CHS.exe
WindowsXP-WindowsMedia-KB978695-x86-CHS.exe
WindowsXP-WindowsMedia-KB975558-x86-CHS.exe
WindowsXP-KB980436-x86-CHS.exe
WindowsXP-WindowsMedia-KB2378111-x86-CHS.exe
WindowsXP-KB982132-x86-CHS.exe
WindowsXP-KB2412687-x86-CHS.exe
windows-kb890830-v3.18.exe
IE8-WindowsXP-KB2510531-x86-CHS.exe
WindowsXP-KB970430-x86-CHS.exe
1

评分人数

    • batman: 感谢给帖子标题标注[已解决]字样PB + 2

手机,我先说我的思路,把-KB换成特殊字符,这样就能用for获取数字了delims。至于长度,我认为用+1向后偏移判断=""就可以得长度,建议在坛子里搜搜看,可能有更好的。获得长度后补0(我的作差过得缺数补0)

TOP

嗯...往后偏移的方法我也想过,就是觉得再加上去,程序就长了...
觉得有正则表达式的话,很简单的一件事,却写得那么长...
所以想问问看有没有比较好的方法

TOP

测试成功了,但代码被我自己删掉了。我咧个去。
不打算再写了。困。

::首先把小写的kb处理一下。
setlocal enabledelayedexpansion
for /f %%i in ('dir /b *.exe^|findstr "kb"') do (
                       set xiao=%%i
                       set xiao2=!xiao:kb=KB!
                       ren !xiao! !xiao2!)

::然后很容易就可以把里面的数字分离出来了。
dir /b *.exe>>1.txt
for /f "tokens=2 delims=KB" %%i in (1.txt) do echo %%i>>temp.1
for /f "tokens=1 delims=-" %%j in (temp.tmp) do echo %%j>>temp.2
del temp.1

:把数字换种形式,形成要更名的文件列表。
用个多级IF函数,看他有几位数。分别用你所需要的格式输出。比如
for %%a in (temp.2) do IF GEQ 10000000 echo %%a>>3.txt else(
......
)

然后利用1.TXT和3.txt来对文件进行批量更名。

TOP

本帖最后由 batman 于 2011-4-30 13:11 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /r c:\update %%a in (*.exe) do (
  3.      set "str=%%~na"&set "str=!str:kb= !"
  4.      for /f "tokens=2 delims= " %%b in ("!str!") do (
  5.           set "str=%%b"&set "a=!str:*-=!"
  6.           for %%b in (!a!) do (
  7.                set "str=00000000!str:-%%b=!"
  8.                ren "%%a" KB!str:~-8!%%~xa
  9.          )
  10.      )
  11. )
复制代码
1

评分人数

***共同提高***

TOP

感谢liaobiaoxing和batman版主!!
版主的方法连临时文件都不需要...实在方便

TOP

5# batman

这个真不错。啥时候我也能写出这么干净的代码。。

不过ren "%%a" KB!str:~-8!.%%~xa 这一行%%前面的点去掉吧。不然会出现KBXXXXXXXX..EXE,多一个点。

TOP

7# liaobiaoxing
估计很快

多谢指出笔误,已改正。。。
***共同提高***

TOP

返回列表