重构两个.bat文件中的代码

时间:2015-01-14 23:03:32

标签: csv batch-file text vbscript

我开发了一个程序(1),编号为info.bat

  • 存储有关计算机的信息,
  • 处理信息并将详细信息输出到%ComputerName%.csv文件。
  • 然后调用.vbs文件(2),这会将已安装程序的列表输出到与%ComputerName%-programs.txt文件位于同一目录中的.csv文件。
  • 批处理文件在.vbs完成后结束,并向用户显示准备好下一个命令的Cmd窗口。

接下来手动启动另一个程序StripSoftware.bat (3)

  • 创建%ComputerName%-programs-to-check.txt
  • 添加操作系统版本和%ComputerName%
  • 检查%ComputerName%-programs.txt
  • 中的条目
  • 取出不需要的匹配(使用findstr和开关),
  • 删除空行
  • 对结果进行排序,
  • 然后将它们放入%ComputerName%-programs-to-check.txt

目标:

  • 我需要在%ComputerName%-programs-to-check.txt中使用软件条目(每个软件名称一行),将它们连接在一起,然后将它们放入software_needed文件的.csv列。

输出:

  • 所需的输出是.csv文件,或者最好是.xlsx文件,第一行包含以下标题,第二行包含适用信息。

.csv示例:

v34,ID,Asset,Sys_Type,Model,NHC Asset,New Sys Type,New Model,New Sys Asset,Domain,DIR,Site,Team,Location,Post,Name,Postcode,Local Printers,Network Printers,Eth_MACs,Wifi_MACs,Phone_MAC,Software Needed,OTHER_ASSET,OS_VER,Hostname,Software_Notes,Other_Notes,IGEL_REC
,,ABCDEFG,PC,A123,,,,,XXXX,Unknown,,,,,,, , ,||"XX-XX-XX-XX-XX-XX"|"Disabled",,,Not Used,ABCDEFG,Win XP Pro,ABCDEFG,,,

info.bat的部分内容:

@echo OFF
setlocal enableextensions enabledelayedexpansion 
SET file="%~dp0%computername%.csv"
If Exist %file% Del %file%
echo %Version_tool%,ID,Asset,Sys_Type,Model,NHC Asset,New Sys Type,New Model,New Sys Asset,Domain,DIR,Site,Team,Location,Post,Name,Postcode,Local Printers,Network Printers,Eth_MACs,Wifi_MACs,Phone_MAC,Software Needed,OTHER_ASSET,OS_VER,Hostname,Software_Notes,Other_Notes,IGEL_REC>>%file%
rem  ========= Other code =========
echo ,%ID%,%serialnumber%,PC,%model%,,,,,%userdomain%,Unknown,,,,,,,%Local_Printers%,!network_printers!,!Eth_MACs!,!Wifi_MACs!,!Phone_MACs!,Not Used,%system%,%osname%,%Hostname%,,,%IGEL REC%>> %file%

SET file2="%~dp0%computername%-programs.txt"
If Exist %file2% Del %file2%
start /b cmd /k "cscript //nologo programs_02.vbs >> %file2%"
echo Batch Tool should finish in a few seconds ...

.vbs档案的内容:

Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE 
strComputer = "." 
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" 
strEntry1a = "DisplayName" 
strEntry1b = "QuietDisplayName" 
strEntry2 = "InstallDate" 
strEntry3 = "VersionMajor" 
strEntry4 = "VersionMinor" 
strEntry5 = "EstimatedSize" 

Set objReg = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv") 
objReg.EnumKey HKLM, strKey, arrSubkeys 
WScript.Echo "Installed Applications" & VbCrLf 
For Each strSubkey In arrSubkeys 
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, strEntry1a, strValue1) 
  If intRet1 <> 0 Then 
objReg.GetStringValue HKLM, strKey & strSubkey, strEntry1b, strValue1 
End If 
If strValue1 <> "" Then 
  WScript.Echo VbCrLf & strValue1 
End If 
objReg.GetStringValue HKLM, strKey & strSubkey, strEntry2, strValue2 
If strValue2 <> "" Then 
  'WScript.Echo "Install Date: " & strValue2 
End If 
objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry3, intValue3 
objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry4, intValue4 
If intValue3 <> "" Then 
   WScript.Echo "Version: " & intValue3 & "." & intValue4 
End If 
objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry5, intValue5 
If intValue5 <> "" Then 
  'WScript.Echo "Estimated Size: " & Round(intValue5/1024, 3) & " megabytes" 
End If 
Next 

问题:

  • 使用当前方式,代码的结构info.bat会在创建.csv文件之前创建.txt文件,并且Software_Needed的值(例如Adobe Flash | Hotfix for Windows)可用在%ComputerName%-programs-to-check.txt。因此很难在第二行使用.csv的值更新Software_Needed

建议的解决方案:(*)

  • 我开始认为应首先调用.vbs文件以在第一个%ComputerName%-programs.txt文件中创建.bat,然后在第二个.bat文件中调用该StripSoftware.bat文件在%ComputerName%-programs-to-check.txt中创建%ComputerName%.csv,然后使用该信息和其他信息创建{{1}}

问题:

1)感谢人们对拟议解决方案的想法,意见和看法

2)建议比解决方案更好的解决方案。

1 个答案:

答案 0 :(得分:-1)

目前还不清楚你想要什么。这是我的标准职位。然后我会给你看一些东西。

开始 - 所有程序 - 附件 - 右键单击​​“命令提示符”,然后选择“以管理员身份运行”。键入(或通过右键单击“命令提示符”窗口并选择“粘贴”进行复制和粘贴)。表格格式的类型

wmic /output:"%userprofile%\desktop\WindowsInstaller.html" product get /format:htable

或表格格式

wmic /output:"%userprofile%\desktop\WindowsInstaller.html" product get /format:hform

它将在桌面上创建一个html文件。

注意

这不是完整列表。这只是与Windows Installer一起安装的产品。一切都没有特色。

但正如我在上一篇文章中所述,几乎所有内容都列在注册表中。

所以要在命令提示符下看到它

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /s

或在文件中

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /s>"%userprofile%\desktop\WindowsUninstall.txt"

以不同的格式在记事本中查看

单击开始 - 所有程序 - 附件 - 右键单击​​命令提示符,然后选择以管理员身份运行。键入Regedit并导航到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

右键单击“卸载”键,然后选择“导出”。如果您保存为reg文件(还有文本文件,它们的文本格式略有不同),您需要右键单击该文件并选择“编辑”进行查看。

查看Windows更新

wmic /output:"%userprofile%\desktop\WindowsUpdate.html" qfe  get /format:htable

这是一个VBS脚本,可以安装程序,排序和过滤器。

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set rs = CreateObject("ADODB.Recordset")
Set wshshell = CreateObject("wscript.shell")
Set Outp = Wscript.Stdout

ComputerName=WshShell.ExpandEnvironmentStrings("%Computername%")

'Build database with Computername and Softwarename

    With rs
        .Fields.Append "ComputerName", 201, 5000 

        .Fields.Append "Txt", 201, 5000 
        .Open

        'Get list installed programs

        Set colItems = objWMIService.ExecQuery("Select * From Win32_Product")

        'Add to database

        For Each objItem in colItems
            .AddNew
            .Fields("ComputerName").value = ComputerName
            .Fields("Txt").value = objItem.Name
            .UpDate
        Next
        'Sort Database on software name

        'Sort and filter it - Softwarename acending (Txt) and filter only those starting M

        .Sort = "Txt ASC"
        .Filter = "Txt like 'm*'"

        'write out to a CSV

        Do While not .EOF
            Outp.writeline .Fields("ComputerName").Value & "," & .Fields("Txt").Value

            .MoveNext
        Loop
    End With

使用

cscript //nologo <path to vbs file> > OUTPUTFILE

这是输出

SERENITY,Microsoft .NET Framework 1.1
SERENITY,Microsoft .NET Framework 3.5 SP1
SERENITY,Microsoft .NET Framework 4 Client Profile
SERENITY,Microsoft .NET Framework 4 Extended
SERENITY,Microsoft Application Compatibility Toolkit 5.0
SERENITY,Microsoft Application Error Reporting
SERENITY,Microsoft Calculator Plus
SERENITY,Microsoft Device Emulator version 3.0 - ENU
SERENITY,Microsoft Document Explorer 2005
SERENITY,Microsoft Filter Pack 1.0
SERENITY,Microsoft LifeCam
SERENITY,Microsoft Mathematics
SERENITY,Microsoft Network Monitor 3.0
SERENITY,Microsoft Office XP Professional
SERENITY,Microsoft OpenType Font File Properties Extension
SERENITY,Microsoft Search Enhancement Pack

所以有三个地方你可以丢弃物品。在WMI select

Set colItems = objWMIService.ExecQuery("Select * from Win32_Product where Name='Microsoft LifeCam'")

并且在使用类似语法的上述过滤器中也是如此。

同时写回来的时候你可以比较它而不是写下你不想要的。