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

[文本处理] 批处理如何在多个文本里寻找关键字并输出?

之前发过帖子求助,我也说几句。对于比我强的人我都成为高手,对于上个帖子给别人带来的困惑表示抱歉,由于没有认真阅读版规表示道歉。

文件夹A中,有这么几个文件,AE52.txt,AH93.txt,这些文件都是收集计算机的信息,ip网关之类的。
AE52.txt内容如下:

Windows IP Configuration



        Host Name . . . . . . . . . . . . : AE52

        Primary Dns Suffix  . . . . . . . :

        Node Type . . . . . . . . . . . . : Unknown

        IP Routing Enabled. . . . . . . . : No

        WINS Proxy Enabled. . . . . . . . : No



Ethernet adapter 本地连接:



        Connection-specific DNS Suffix  . :

        Description . . . . . . . . . . . : Intel(R) PRO/100 VE Network Connection

        Physical Address. . . . . . . . . : 00-80-87-0E-A8-7A

        Dhcp Enabled. . . . . . . . . . . : No

        IP Address. . . . . . . . . . . . : 10.3.157.227

        Subnet Mask . . . . . . . . . . . : 255.255.255.240

        Default Gateway . . . . . . . . . : 10.3.157.238

主机名:           AE52
OS 名称:          Microsoft Windows XP Professional
OS 版本:          5.1.2600 Service Pack 3 Build 2600
OS 制造商:        Microsoft Corporation
OS 配置:          独立工作站
OS 构件类型:      Uniprocessor Free
注册的所有人:     cds6040t
注册的组织:       YH
产品 ID:          76481-641-1465534-23259
初始安装日期:     2012-3-19, 11:51:50
系统启动时间:     0 天 0 小时 4 分 23 秒
系统制造商:       Intel Corporation
系统型号:         Montara Family of Chipsets
系统类型:         X86-based PC
处理器:           安装了 1 个处理器。
                  [01]: x86 Family 15 Model 2 Stepping 9 GenuineIntel ~2791 Mhz
BIOS 版本:        PTLTD  - 6040000
Windows 目录:     C:\WINDOWS
系统目录:         C:\WINDOWS\system32
启动设备:         \Device\HarddiskVolume1
系统区域设置:     zh-cn;中文(中国)
输入法区域设置:   zh-cn;中文(中国)
时区:             暂缺
物理内存总量:     1,014 MB
可用的物理内存:   693 MB
虚拟内存: 最大值: 2,048 MB
虚拟内存: 可用:   2,005 MB
虚拟内存: 使用中: 43 MB
页面文件位置:     C:\pagefile.sys
域:               YH
登录服务器:       \\AE52
修补程序:         安装了 137 个修补程序。
"MNAME","A"
"RESERVE1",""
"RESERVE2",""
"RESERVE3","software\abc_bj_cardbin.txt/10.3.16.114/21/atmftp/atmatm"
"TIMEOUT_CARD","30"
"TIMEOUT_NOTE","60"
"TIMEOUT_VNOTE","150"
"TIMEOUT_WAIT","30"
"TIMEOUT_COMM","60"
"TIMEOUT_IDL","30"
"TIMEOUT_PIN","30"
"TIMEOUT_KEY","30"
"TIMEOUT_KDR","60"
"TIMEOUT_TAKERNOTE","120"
"TIMEOUT_ERRMSG","300"
"DISKSPACE","200"
"TIMERESETCOMM","60"
"TFRACCOUNTLEN","19"
"TFRAMOUNTLEN","8"
"TFRMAXAMOUNT","50000"
"TFRMINAMOUNT","0"
"CWDMAXAMOUNT","3000"
"CSHINMAXCOUNT","100"
"CHANNALNO","0"
"CASSETTEMINNUM","10"
"CashoutCassetteNum","5"
"CashInCassetteNum","6"
"INPUTMAXCOUNT","3"
"INPUTMAXPASSWORD","3"
"INPUTMAXACCOUNT","3"
"MAXRETRACTNUM","100"
"CWDMAXRETRACTNUM","100"
"COMMTYPE","1"
"OUT50NUM","0"
"CashModel","2"
"CUTLEN",""
"ISCHIP","0"
"ISSPBDEVICE","0"
"ISENCRYPT","0"
"ISWRITEONLY","0"
"MultiValidate","3"
"ISMONITOR","0"
"ISMESSAGE","0"
"ISOPERATORTYPE","0"
"ISINTOSUPER","1"
"PINKEY","1111111111111111"
"MACHINEPASS","95599"
"ISCOMPANY","0"
"ISTIMEOUT","0"
"ISCINAMT","0"
"SOFTVER","COLS_ABC_BeiJing_007.007.000_CDS6040T&W"
"ISCSHDEVICE","2"
"ISCSHDEVICESN","2"
"ISCONFIRM","2"
"LUNO","1301AE52"
"BRANCHNAME","FTG82"
"SERIALNAME","A0906013648"
"NETNO","1301"
"ISCARD","1"
"ISKDRDEVICE","3"
"ISJRNDEVICE","1"
"ISCSHDEVICE","2"
"ISEPPDEVICE","2"
"ISPANEL","1"
"ISSCREEN","2"
"ISGIMKS","0"
"DEVICE","CDS6040T"
"ISABIS","0"
"PackVer","00"
"ISCSHDEVICESN","2"
"ISCWDDEVICE","2"
[MAIN PARAMETER]
Version=2
RecvFlag=2
SendSign=0
Debug=0
HostPortNo0=3010
HostPortNo1=0
HostPortNo2=0
HostPortNo3=0
LocalPortNo0=0
LocalPortNo1=0
LocalPortNo2=0
LocalPortNo3=0
PortNo=0
NetAddress=10.3.6.11
[ICMP PARAMETER]
ICMPSign=0
ICMPInterval=30
SendTimeOut=10
RecvTimeOut=60
ICMPStrlen=15
ICMPStr=This is a test!
[LINK PARAMETER]
ReadInterval=1
[THREAD DEFINE]
WaitThreadExitTime=5
WaitThreadStartTime=30




我想做:
每次从文件夹A中读出1个文件,提取出里面的LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频等信息,写到一个a.csv中。(因为csv的文件,可以用excel打开方便)

a.csv的样子像这样

LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频
AE52,1301,3010, 10.3.235.32,255.255.255.240,10.235.3,x86 Family 15 Model 2 Stepping 9 GenuineIntel ~2791 Mhz
AH93,1301,3010, 10.3.235.32,255.255.255.240,10.235.3,x86 Family 15 Model 2 Stepping 9 GenuineIntel ~2791 Mhz

拜谢~!~主要为了方便工作,我知道用for语句可以做,但是弄了半天,没有搞成。

标题依旧不合格的,你认真读了版规没
1

评分人数

    • CrLf: 感谢主动维护论坛秩序!PB + 5

TOP

lz请把标题改成  在多个文本里寻找关键字并输出  

我给你代码。
1

评分人数

    • CrLf: 感谢主动维护论坛秩序!PB + 5

TOP

  1. @echo off
  2. :start ============================================================
  3. echo LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频>>cc.txt
  4. set "_CPU_BL=0"
  5. for /f "tokens=* delims=" %%A in ('dir /a-d/b/s "文件夹A\*.txt"') do (
  6. setlocal enabledelayedexpansion
  7. for /f "tokens=1,2* usebackq delims=.,=: " %%a in ("%%~A") do (
  8. if /i "%%~a"=="LUNO" set "_LUNO=%%~b"
  9. if /i "%%~a"=="NETNO" set "_NETNO=%%~b"
  10. if /i "%%~a"=="HostPortNo0" set "_HostPortNo0=%%~b"
  11. if /i "%%~a %%~b"=="IP Address" set "_IP_Address=%%~c"
  12. if /i "%%~a %%~b"=="Subnet Mask" set "_Subnet_Mask=%%~c"
  13. if /i "%%~a %%~b"=="Default Gateway" set "_Default Gateway=%%~c"
  14. if !_CPU_BL!==1 set "_CPU=%%~b %%~c"&set "_CPU_BL=0"
  15. if /i "%%~a"=="处理器" set "_CPU_BL=1"
  16. )
  17. echo !_LUNO!,!_NETNO!,!_HostPortNo0!,!_IP_Address!,!_Subnet_Mask!,!_Default Gateway!,!_CPU!
  18. endlocal
  19. )>>cc.txt
  20. :end=============================================================
复制代码
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

本帖最后由 apang 于 2012-4-29 23:12 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. echo LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频>a.csv
  3. for /f "delims=" %%i in ('dir /b *.txt') do (
  4.   set str=
  5.   for %%a in ("LUNO" "NETNO" "HostPortNo0" "IP Address" "Subnet Mask" "Default Gateway" "Mhz") do (
  6.     for /f "tokens=2 delims=,:=" %%b in ('findstr /i /c:"%%~a" "%%i"') do (
  7.       set "str=!str!,%%~b"
  8.     )
  9.   )
  10.   if not "!str!"=="" echo,!str:~5!>>a.csv
  11. )
复制代码

TOP

是工作急用的吧?看楼主这么纠结,干脆按 3 楼的建议帮你改了...
平时看到新会员犯规时常会帮忙改一下,老会员则一贯是警告,下不为例哦~

TOP

回复 5# apang

用了全角的逗号, 我用的 EXCEL 2003 没有对这样的 CSV 分列

TOP

回复 7# neorobin

多谢提醒,已改过来了。

TOP

回复 7# neorobin


    我只知道 xls 默认能识别以 tab 分割的表格或者 htm 表格...比如
  1. @echo off
  2. set "tab=tab制表符"
  3. rem 这里请自行替换成实际符号
  4. (for /l %%a in (1 1 9) do (
  5. setlocal enabledelayedexpansion
  6. for %%b in (a b c d e) do set "str=!str!%tab%%%a%%b
  7. echo !str:~1!
  8. endlocal
  9. ))>1.xls
  10. pause
复制代码
  1. @echo off
  2. (echo ^<table^>
  3. for /l %%a in (1 1 9) do (
  4. setlocal enabledelayedexpansion
  5. for %%b in (a b c d e) do set "str=!str!<td>%%a%%b</td>"
  6. echo ^<tr^>!str!^</tr^>
  7. endlocal
  8. )
  9. echo ^</table^>)>1.xls
  10. pause
复制代码
除了 htm 格式和 tab 制表符,是否还有其他可识别的分隔符?

TOP

回复 9# CrLf

EXCEL 可以打开 CSV 文件, 但不会把全角逗号当分列符,
半角逗号分列, CRLF 分行(仅 CR 或 LF 没测试过, 不知可否)

http://en.wikipedia.org/wiki/Comma-separated_values
http://zh.wikipedia.org/wiki/逗号分隔值
1

评分人数

    • CrLf: 3q,学习了,我一直是保存为 xls 的PB + 5

TOP

回复 9# CrLf

在 EXCEL 打开文件的对话框的文件类型下拉列表框那里就可以看到很多可以打开的文件类型, 事实上我常用的类型也屈指可数
这里也有点说明:
http://office.microsoft.com/assi ... ;LCS=1&respos=4

TOP

感谢大家的支持
利用hfg1977 的代码
最后输出多个在ip,掩码,网关后面多了个实心方框,无法正确的排列,我手工修改输出文件cc.txt,将ip,掩码,网关后面实心方框删除,并把cc.txt后缀改成cc.csv后,排列正常。帮忙搞搞输出时候,别让他输出实心方框。

TOP

感谢大家的支持
利用hfg1977 的代码
最后输出多个在ip,掩码,网关后面多了个实心方框,无法正确的排列,我手工修改输出文件cc.txt,将ip,掩码,网关后面实心方框删除,并把cc.txt后缀改成cc.csv后,排列正常。帮忙搞搞输出时候,别让他输出实心方框。

TOP

ipconfig /all 命令返回的信息每行后面有个"退格键" (CMD环境)
保存为TXT后不会存在.

现在不确定你的实心方框到底是什么.
添加一行过滤,把 换成你自己的.
  1. ...
  2. )
  3. for /f "tokens=1* delims==" %%a in ('set _') do set "%%a=!%%a:=++!"
  4. echo !_LUNO!.......
复制代码
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

  1. ::pushd A 这个A是要处理的文件夹。如果路径中有空格要加引号。比如"E:\E:\Users\Canyue\Te st"
  2. @echo off & setlocal enabledelayedexpansion
  3. set "now=%cd%" & pushd A || exit
  4. set "cline=LUNO;NETNO;HostPortNo0;IP-Address;Subnet-Mask;Default-Gateway"
  5. set temp=%cline:IP-Address=IP%
  6. set temp=%temp:Subnet-Mask=子网掩码%
  7. set temp=%temp:Default-Gateway=网关%
  8. echo %temp:;=,%,处理器频率 > "%now%\a.csv"
  9. for /f "tokens=* delims=" %%f in ('dir /b /a-d *.txt') do (call :findc "%%f") >> "%now%\a.csv"
  10. echo 所有完成。
  11. pause>nul
  12. exit
  13. :findc
  14. setlocal
  15. for %%i in (%cline%) do (
  16.     set "cfind=%%i" & set "cfind=!cfind:-= !"
  17.     for /f "skip=2 tokens=2 delims==,:" %%j in ('find "!cfind!" "%~1"') do set %%i=%%~j
  18. )
  19. for %%i in (%cline%) do call set /p=%%%%i%%,<nul
  20. for /f "skip=2 tokens=1 delims=[]: " %%i in ('find /n "处理器:" "%~1"') do set line=%%i
  21. for /f "skip=%line% tokens=2 delims=: usebackq" %%i in ("%~1") do if not defined v echo %%i & set v=b
  22. endlocal
  23. goto :eof
复制代码

TOP

返回列表