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

[文件操作] [已解决]求一个截取KB补丁号的批处理

本帖最后由 stance 于 2012-11-3 20:28 编辑

现在有一堆Windows XP 更新补丁在文件夹里,想从中提取出更新补丁号码到文本中。
原文件名有如下8种类型:
IE8-WindowsXP-KB971961-x86-CHS.exe
msxml4-KB954430-chs.exe
WindowsXP-KB923561-x86-CHS.exe
WindowsXP-WindowsMedia-KB952069-v2-x86-CHS.exe
ndp20sp2-kb976576-x86_8e8121a8bddfb2095453335c593ffa22ef8e95ec.exe
windows-kb890830-v4.13-delta_68a9d9cc7be6710084ea178dd427b63c7d763dfd.exe
windowsxp-kb2296011-x86-chs_0f105045c23834baa6dfb662f55152b71f1be67b.exe
windows-zh-cn-kb2564958_2fa3610df66fd668b67b9d6d30da008741903c67.exe

想要的结果:
KB971961
KB954430
KB923561
KB952069
kb976576
kb890830
kb2296011
kb2564958

因为还要用此批处理做其他用途,希望语句简洁,移植性强。

  1. @echo off
  2. (for %%a in (*.exe) do (
  3.   set "Name=%%~na"
  4.   setlocal enabledelayedexpansion
  5.   set "Name=!Name:-=" "!"
  6.   for %%b in ("!Name:_=" "!") do (
  7.     set "str=%%~b"
  8.     set "a=%%~b"
  9.     for /l %%c in (0 1 9) do set "a=!a:%%c=!"
  10.     if /i "!str:~,2!"=="kb" if /i "!a!"=="kb" echo,!str!
  11.   )
  12.   endlocal
  13. ))>List.txt
复制代码
简洁、移植性强的偶写不出来啊。。。
1

评分人数

TOP

回复 2# apang


    谢谢谢谢!敬佩。

TOP

本帖最后由 CrLf 于 2012-11-3 21:23 编辑

回复 2# apang


    另一种写法,循环次数少,但是不太好理解...
  1. @echo off
  2. (for %%a in (*KB*.exe) do (
  3.   set "Name=%%~na"
  4.   setlocal enabledelayedexpansion
  5.   for /f "delims=-_" %%b in ("!Name:*KB=KB!") do (
  6.     endlocal
  7.     for /f "tokens=1* delims=0123456789" %%c in ("%%b$") do (
  8.        if /i %%c%%d==KB$ echo %%b.exe
  9.     )
  10.   )
  11. ))>List.txt
复制代码
不过现在想想其实不严谨,要是文件名中有多处 KB 可能会漏判,还是 apang 的代码比较通用
1

评分人数

TOP

本帖最后由 stance 于 2012-11-3 20:41 编辑

回复 4# CrLf


   谢谢 CrLf!
不过,我运行一下,输出结果为空。
想改一下,又确实不好理解。是不是%%c%%d==KB.exe这一句?……

TOP

回复 5# stance


    原先写的有逻辑误区,已修改

TOP

回复 4# CrLf


    delims=0123456789 这个方法不错,学习了。

TOP

呵呵,ZM的SETLOCAL的位置很有意思,很值得学习,级时的结束以提高效率
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

回复 8# wc726842270


    其实主要目的还是在确保 endlocal 与 setlocal 能一一对应的情况下,避免 %%b 含 ! 号产生意外结果...

TOP

返回列表