Board logo

标题: [系统相关] 硬件信息收集.bat代码求优化。 [打印本页]

作者: a7701    时间: 2012-6-24 16:59     标题: 硬件信息收集.bat代码求优化。

本帖最后由 a7701 于 2012-6-24 17:59 编辑

个人整理的硬件信息收集批处理,请教各位前辈还能不能再优化代码。
  1. @echo off
  2. color 0a
  3. title   硬件检测     
  4. mode con cols=40  lines=10
  5. sc config winmgmt start= auto >nul 2<&1
  6. net start winmgmt 2>nul
  7. setlocal ENABLEDELAYEDEXPANSION
  8. set file=!computername!.txt
  9. set txt=info.tmp
  10. if exist !file! del !file!
  11. cls
  12. echo.
  13. echo     正在收集硬件信息中,请稍候......
  14. echo     --------------------------------
  15. echo    ┏━━━━━━━━━━━━━━━┓
  16. echo    ┃  !!!请勿关闭本程序!!! ┃
  17. echo    ┃    如果程序打扰了您的工作  ┃
  18. echo    ┃        请把程序最小化      ┃
  19. echo    ┗━━━━━━━━━━━━━━━┛
  20. echo     --------------------------------
  21. ::从DXDIAG里获取主机型号、CPU、内存信息
  22. dxdiag /t !txt!
  23. for /f "tokens=2 delims=:" %%i in ('type !txt! ^| findstr /i /c:"System Model"') do set XH=%%i
  24. for /f "tokens=2 delims=:" %%i in ('type !txt! ^| findstr /i /c:"          Processor:"') do set CPU=%%i
  25. for /f "tokens=2 delims=:" %%i in ('type !txt! ^| findstr /c:"             Memory:"') do set NC=%%i
  26. ::内存容量取整
  27. set /a mmem=!NC:~0,-6!
  28. if !mmem! LEQ 800 set mem=!mmem!MB
  29. if !mmem! LEQ 1250 (
  30.    if !mmem! GEQ 850 (
  31.       set mem=1G
  32.      )
  33.    )
  34. if !mmem! LEQ 1750 (
  35.    if !mmem! GEQ 1250 (
  36.       set mem=1.5G
  37.      )
  38.    )
  39. if !mmem! LEQ 2250 (
  40.    if !mmem! GEQ 1750 (
  41.       set mem=2G
  42.      )
  43.    )
  44. if !mmem! GEQ 3250 set mem=4G
  45. ::用WMIC命令获取硬盘型号与硬盘容量
  46. for /f "skip=1 tokens=*" %%i in ('wmic DISKDRIVE get caption') do (
  47. if not "%%i"=="" (set/a n+=1&set HDD!n!=%%i)
  48. )
  49. for /f "skip=1 delims=" %%i in ('wmic DISKDRIVE get size') do call set 硬盘大小=!!硬盘大小!! %%i
  50. for /f "tokens=1,2,3,4" %%i in ("!硬盘大小!") do call set Size1=%%i&set Size2=%%j&set Size3=%%k&set Size4=%%l
  51. ::硬盘容量取整
  52. set /a Size1=!Size1:~0,-9!
  53. set /a Size2=!Size2:~0,-9!
  54. set /a Size3=!Size3:~0,-9!
  55. set /a Size4=!Size4:~0,-9!
  56. if !Size1:~-1! LEQ 9 (
  57.    if !Size1:~-1! GEQ 1 (
  58.       set /a size1=!size1!+1
  59.      )
  60.    )
  61. if !Size2:~-1! LEQ 9 (
  62.    if !Size2:~-1! GEQ 1 (
  63.       set /a size2=!size2!+1
  64.      )
  65.    )
  66. if !Size3:~-1! LEQ 9 (
  67.    if !Size3:~-1! GEQ 1 (
  68.       set /a size3=!size3!+1
  69.      )
  70.    )
  71. if !Size4:~-1! LEQ 9 (
  72.    if !Size4:~-1! GEQ 1 (
  73.       set /a size4=!size4!+1
  74.      )
  75.    )
  76. if !Size1! GEQ 40 set /a size1=!size1!-!Size1:~-1!
  77. if !Size2! GEQ 40 set /a size2=!size2!-!Size2:~-1!
  78. if !Size3! GEQ 40 set /a size3=!size3!-!Size3:~-1!
  79. if !Size4! GEQ 40 set /a size4=!size4!-!Size4:~-1!
  80. if !Size2! LEQ 39 set /a size2=!size2!-1
  81. if !Size3! LEQ 39 set /a size3=!size3!-1
  82. if !Size4! LEQ 39 set /a size4=!size4!-1
  83. if !size1! GEQ 0 (set size1=!size1!G) else set "size1= "
  84. if !size2! GEQ 0 (set size2=!size2!G) else set "size2= "
  85. if !size3! GEQ 0 (set size3=!size3!G) else set "size3= "
  86. if !size4! GEQ 0 (set size4=!size4!G) else set "size4= "
  87. ::获取IP等信息及WMIC取显卡、声卡型号
  88. for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:"IP Address"') do set IP=%%i
  89. for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:"Subnet Mask"') do set Subnet=%%i
  90. for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:"Physical Address"') do set mac=%%i
  91. for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:"Default Gateway"') do set gateway=%%i
  92. for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:"DNS Servers"') do set dns=%%i
  93. for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:"Description"') do set netcard=%%i
  94. for /f "skip=1 delims=" %%i in ('wmic SOUNDDEV get ProductName') do set SOUND=%%i
  95. for /f "tokens=1,2 delims==" %%a in ('wmic path Win32_VideoController get AdapterRAM^,Name /value^|findstr "AdapterRAM Name"') do set Video=%%b
  96. ::输出到文件并清除临时文件
  97. echo.>>!file!
  98. echo 计算机名:        !computername!>>!file!
  99. echo 主机型号:       !XH!>>!file!
  100. echo CPU 相关:       !CPU!>>!file!
  101. echo 内存总量:        !mem!>>!file!
  102. if not "!HDD1!"=="" echo 硬盘1型号:       !HDD1:~0,-2!>>!file!
  103. if not "!HDD1!"=="" echo 硬盘1容量:       !size1!>>!file!
  104. if not "!HDD2!"=="" echo 硬盘2型号:       !HDD2:~0,-2!>>!file!
  105. if not "!HDD2!"=="" echo 硬盘2容量:       !size2!>>!file!
  106. if not "!HDD3!"=="" echo 硬盘3型号:       !HDD3:~0,-2!>>!file!
  107. if not "!HDD3!"=="" echo 硬盘3容量:       !size3!>>!file!
  108. if not "!HDD4!"=="" echo 硬盘4型号:       !HDD4:~0,-2!>>!file!
  109. if not "!HDD4!"=="" echo 硬盘4容量:       !size4!>>!file!
  110. echo 声卡型号:        !SOUND!>>!file!
  111. echo 显卡型号:        !Video!>>!file!
  112. echo 网卡型号:       !netcard!>>!file!
  113. echo MAC 地址:       !mac!>>!file!
  114. echo I P 地址:       !IP!>>!file!
  115. echo 子网掩码:       !Subnet!>>!file!
  116. echo 网    关:       !gateway!>>!file!
  117. echo D  N  S :       !dns!>>!file!
  118. echo.>>!file!
  119. echo.>>!file!
  120. echo 下面是DXDIAG生成的信息。>>!file!
  121. echo.>>!file!
  122. type !txt!>>!file!
  123. del /f !txt!
  124. exit
复制代码

作者: a7701    时间: 2012-6-24 17:15

这个代码最慢就是DXDIAG那里了,没办法从其他地方找到主机型号、CPU型号与频率这些信息。
容量计算方面,批处理的计算也是超级弱,个人的数学也不大好,只能做到这个程度了。
作者: cb02356828    时间: 2012-6-24 17:40

前面已经@echo off了后面就不用每句前面都@了
作者: a7701    时间: 2012-6-24 17:55

谢谢cb02356828,这确实是一个不大好的习惯,努力改正。
作者: lky216    时间: 2012-6-24 18:03

这个有一点点信息
  1. systeminfo
复制代码

作者: forfiles    时间: 2012-6-24 18:17

本帖最后由 forfiles 于 2012-6-24 18:32 编辑

set file=!computername!.txt
set txt=info.tmp
建议把这些放到%temp%目录下面,以免误删当前目录下的同名文件。
作者: forfiles    时间: 2012-6-24 18:25

这个帖子里面还有主板、显示器、打印机等信息
http://www.bathome.net/thread-1850-1-1.html
作者: forfiles    时间: 2012-6-24 18:26

回复 2# a7701


没办法从其他地方找到主机型号、CPU型号与频率这些信息。

都用WMIC吧

容量计算方面,批处理的计算也是超级弱,个人的数学也不大好,只能做到这个程度了。

找个容量转换的函数吧,论坛有不少类似的代码,Byte转MB、GB什么的。
作者: forfiles    时间: 2012-6-24 18:31

把108到115行这些重复的if命令改写成一个for命令吧

不过话说回来,直接把wmic的结果写入文件就行了吧?
  1. wmic DISKDRIVE get caption,size /value
复制代码

作者: a7701    时间: 2012-6-25 11:26

set file=!computername!.txt
set txt=info.tmp
建议把这些放到%temp%目录下面,以免误删当前目录下的同名 ...

其实我的代码上还有一些连接服务器,把结果文件复制到服务器的指定目录并删除本机所有生成的文件的命令的。如:
set server=\\192.168.1.245\sysinfo
net use %server% pass /user:user
move /Y %file% %server%
del %0

还有你说的那个帖子也我看了,我整理这个BAT就是因为他那个批处理得出来的信息太乱,所以自己想整理一下,排好版,
并写进文件做存档,对于企业网管这种职业要处理一大批机器来说这个就很好了。

论坛里找的一些字节转换为MB、GB的代码多少都还是有些出入,我这里的容量就是确定在哪个范围的数值反应到物理容
量上又是怎样的。就是要确定物理内存容量和硬盘物理总容量,因为在不同机器的一些数值又不一样,所以我这里只是按
范围来判断。

lky216 所说的systeminfo 里面的CPU信息太笼统。
作者: forfiles    时间: 2012-6-25 11:44

回复 10# a7701


    不知道你说的有出入是什么意思。如果你想坚持用if的话,也应该用if...else...
  1. if !mmem! LEQ 800 (
  2.     set mem=!mmem!MB
  3. ) else if !mmem! LEQ 1250 (
  4.    if !mmem! GEQ 850 (
  5.         set mem=1G
  6.     )
  7. ) ...
复制代码

作者: flyingd    时间: 2012-6-27 14:13

这边我在用的一段代码 用于装机自动认硬件
  1. @ECHO OFF
  2. REM Marco to detect PNPID
  3. REM Script by Roger LE
  4. ECHO ------Set Var----
  5. LOG=C:\HARDWARE.TXT
  6. ECHO ------Script----
  7. If exist %LOG% DEL %LOG%
  8. for /f "tokens=9,11 delims=\&_" %%i in ('reg query hklm\system\currentcontrolset\enum\pci') do echo %%i%%j>> %LOG%
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2