找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27591|回复: 8

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

[复制链接]
发表于 2012-11-3 15:49:09 | 显示全部楼层 |阅读模式
本帖最后由 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

因为还要用此批处理做其他用途,希望语句简洁,移植性强。
发表于 2012-11-3 18:13:08 | 显示全部楼层
  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技术 +1 收起 理由
stance + 1 乐于助人

查看全部评分

 楼主| 发表于 2012-11-3 18:36:02 | 显示全部楼层
回复 2# apang


    谢谢谢谢!敬佩。
发表于 2012-11-3 20:22:51 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
stance + 1 乐于助人

查看全部评分

 楼主| 发表于 2012-11-3 20:39:43 | 显示全部楼层
本帖最后由 stance 于 2012-11-3 20:41 编辑

回复 4# CrLf


   谢谢 CrLf!
不过,我运行一下,输出结果为空。
想改一下,又确实不好理解。是不是%%c%%d==KB.exe这一句?……
发表于 2012-11-3 21:21:33 | 显示全部楼层
回复 5# stance


    原先写的有逻辑误区,已修改
发表于 2012-11-3 22:42:06 | 显示全部楼层
回复 4# CrLf


    delims=0123456789 这个方法不错,学习了。
发表于 2012-11-4 03:43:10 | 显示全部楼层
呵呵,ZM的SETLOCAL的位置很有意思,很值得学习,级时的结束以提高效率
发表于 2012-11-4 13:59:51 | 显示全部楼层
回复 8# wc726842270


    其实主要目的还是在确保 endlocal 与 setlocal 能一一对应的情况下,避免 %%b 含 ! 号产生意外结果...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 20:56 , Processed in 0.025661 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表