Board logo

标题: [注册表类] [已解决]批处理怎样提取已安装软件的资料? [打印本页]

作者: laotou1000    时间: 2010-3-22 11:12     标题: [已解决]批处理怎样提取已安装软件的资料?

大家好!
       我想编写一个脚本,其功能如下:运行该脚本,脚本从注册表中将操作系统中所安装的所有应用软件收集起来,同时收集主机名、系统安装时间、内存大小、IP地址,并生成一个Excel表格。该表格中分别记录安装应用软件的时间、软件名称、软件所在位置以及主机名、系统安装时间、内存大小、IP地址。
       请各位前辈多多指教,谢谢!

[ 本帖最后由 laotou1000 于 2010-4-2 09:40 编辑 ]
作者: bat007    时间: 2010-3-22 20:50

  1. systeminfo | findstr "主机名.* 初始安装日期.* 物理内存总量.* [1-9].*\.[1-9].*\.[1-9].*\.[1-9]"
复制代码

作者: laotou1000    时间: 2010-3-25 18:24     标题: 回复 2楼 的帖子

谢谢bat007的帮助!
那么前面的功能如何才能实现呢?(就是收集系统中安装了哪些应用软件的功能)
作者: bat007    时间: 2010-3-25 23:32

1、并不是所有的软件在安装的时候都会向注册表写入信息
2、并不是所有的软件在安装的时候都会向同一个注册表分支写入信息
作者: laotou1000    时间: 2010-3-29 10:41     标题: 回复 4楼 的帖子

那么有什么方法可以实现这种收集方案呢?
有没有什么方法可以将 添加/删除程序 中的软件收集到啊?
作者: neorobin    时间: 2010-3-29 12:00     标题: 回复 5楼 的帖子

  1. reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /s
复制代码
着手
作者: laotou1000    时间: 2010-3-30 09:57     标题: 回复 6楼 的帖子

非常感谢您的提示!!!
那么能否帮我看看如何从我的这些资料中提取呢?(我个人对这方面不是很熟)
作者: neorobin    时间: 2010-3-30 16:48     标题: RE 7楼

  1. @echo off&setlocal enabledelayedexpansion
  2. (set uninsRoot=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall)
  3. (set _skip=0)
  4. for /f "delims=" %%z in ('reg query !uninsRoot! /s ^| findstr /i "displayname uninstallstring"') do (
  5.   (set _F=%%z)&(set QUSP=!_F!)&(set nameP=!_F!)&(set sp_rjgxP=!_F!)&(set sp_gxP=!_F!)&(set usP=!_F!)
  6.   (set nameP=!nameP:DisplayName=!)&(set usP=!usP:UninstallString=!)&(set QUSP=!QUSP:QuietUninstallString=!)
  7.   (set sp_rjgxP=!sp_rjgxP:软件更新=!)&(set sp_gxP=!sp_gxP:(KB=!)
  8.   
  9.   if "!_F!" neq "!nameP!" (
  10.     (set _skip=0)   
  11.     if "!_F!" neq "!sp_rjgxP!" (set _skip=1)
  12.     if "!_F!" neq "!sp_gxP!" (set _skip=1)
  13.   )
  14.   
  15.   if !_skip! equ 0 if "!_F!" equ "!QUSP!" ( rem 跳过 QuietUninstallString
  16.     (set line=%%z)&(set line=!line:*REG_SZ=!)&(set line=!line:*REG_EXPAND_SZ=!)&(set line=!line:~1!)  
  17.     if "!_F!" neq "!nameP!" (echo.)&echo !line!
  18.     if "!usP!" neq "!_F!" (
  19.       for /f "delims=" %%B in ("!line!") do (
  20.         (set softdir=%%~sdpB)
  21.         if exist !softdir!nul (
  22.           for /f "delims=" %%l in ('dir "%%~dpB" /a-d /s /-c ^| findstr "个文件"') do (
  23.             for /f "tokens=3 delims= " %%a in ("%%l") do (set size=%%a)
  24.           )
  25.           set /a "size=(size+1048576/2)/1048576"
  26.           echo %%~dpB !size!MB %%~tB
  27.         )      
  28.       )
  29.     )
  30.   )
  31. )
  32. pause
复制代码
以上代码可以部分正确的获取应用软件的位置, 大小, 相关时间, 要更完全的解决问题需要对注册表更复杂全面的分析, 甚至其它更好的途径
以下是代码测试输出的部分结果:
360杀毒
C:\Program Files\360\360sd\ 230MB 2009-11-30 下午 19:22

Adobe Flash Player 10 ActiveX
C:\WINDOWS\system32\Macromed\Flash\ 16MB 2010-02-25 下午 22:08

Adobe Flash Player 10 Plugin
C:\WINDOWS\system32\Macromed\Flash\ 16MB 2010-02-17 下午 13:53

AutoIt v3.3.6.0
C:\Program Files\AutoIt3\ 22MB 2010-03-26 下午 15:38

百度Hi
C:\Program Files\baidu\Baidu Hi\ 39MB 2010-02-24 下午 14:12

Conexant HD Audio
C:\Program Files\CONEXANT\CNXT_AUDIO_HDA\ 1MB

HDAUDIO Soft Data Fax Modem with SmartCP
C:\Program Files\CONEXANT\CNXT_MODEM_HDA_HSF\ 1MB

[ 本帖最后由 neorobin 于 2010-3-30 17:36 编辑 ]
作者: laotou1000    时间: 2010-4-2 09:37     标题: 回复 8楼 的帖子

非常感谢您的帮助!!!
基本上可以实现我的目的了,正如您说的有些软件只能收集到名称,但是大小、位置却收集不到。
不过这样也能够初步实现我的需求了。
再次感谢您的帮助!!!!




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