'****************************************************************
' Filename..: installedApps.vbs
' Author....: David M. Stein aka Scriptzilla aka dipshit
' Date......: 10/20/2011
' Purpose...: save query of installed applications to local file
'****************************************************************
Const strInputFile = "c:\regoutput.txt"
Const strOutputFile = "c:\installedApps.txt"
Const ForReading = 1
Const ForWriting = 2
Const adVarChar = 200
cmd = "reg query hklm\software\microsoft\windows\currentversion\uninstall /s >" & strInputFile
On Error Resume Next
Set objShell = CreateObject("Wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
wscript.echo "info: executing shell command to create temp file..."
objShell.Run "cmd /c " & cmd, 7, True
wscript.echo "info: getting temp file for input..."
If objFSO.FileExists(strInputFile) Then
wscript.echo "info: reading temp file..."
Set objFile = objFSO.OpenTextFile(strInputFile, ForReading)
Set objFile2 = objFSO.CreateTextFile(strOutputFile, True)
Set rs = CreateObject("ADODB.RecordSet")
rs.CursorLocation = adUseClient
rs.Fields.Append "productname", adVarChar, 255
rs.Open
Do Until objFile.AtEndOfStream
strLine = objFile.Readline
If Left(strLine, 25) = " DisplayName REG_SZ" Then
strOutput = Trim(Mid(strLine, 30))
rs.AddNew
rs.Fields("productname").value = strOutput
rs.Update
End If
Loop
rs.Sort = "productname"
Do Until rs.EOF
objFile2.WriteLine(rs.Fields("productname").value)
rs.MoveNext
Loop
rs.CLose
Set rs = Nothing
objFile.Close
objFile2.Close
wscript.echo "info: finished scrubbing input to new output file"
Else
wscript.echo "fail: temp file not found"
End If
Set objFSO = Nothing
Set objShell = Nothing
'----------------------------------------------------------------
wscript.echo "info: processing complete!"
Showing posts with label ado. Show all posts
Showing posts with label ado. Show all posts
Thursday, October 20, 2011
Query Installed Apps a Different Way
For whatever reason, in some environments, a WMI query of Win32_Product is God-awful slow. I've seen this on Windows 7 and Windows 7 SP1 clients, as well as on Windows Server 2008 and 2008 R2. The symptom can be seen from WIM script, WBEM, and using WMIC from a command console with very similar results: The query hangs for 20-25 seconds and then begins executing in spurts. Other Win32 classes work fine, from what I've seen, it's just Win32_Product for some reason. One workaround is to dump a registry output file, and scrub it to make a "clean" output file. You can port this to PowerShell or KiXtart if you want (or whatever you prefer, I really don't care as long as you're happy and that makes me happy so we're all happy. yay!)
Thursday, December 31, 2009
VBScript ADO with XML and CSV Data Files
I was poking around to find a way to read CSV, TXT (various delimiters) through VBScript for use in scripted data migrations, as well as to render the data in ASP, and found some interesting things. I have to give credit to [http://www.mombu.com/microsoft/scripting-wsh/t-query-xml-file-with-ado-in-wsh-131431.html] for the XML example. I only modified it slightly to fit in with how I tend to code ADO processes. I also would like to applaud the efforts of Connection Strings.com for their fantastic reference site for connection information for almost anything that can possibly store information.
Reading XML Data
Const dsn = "Provider=MSDAOSP;Data Source=MSXML2.DSOControl;"
Const adChapter = 136
Dim conn, rs
Dim iLevel : iLevel = 0
Set conn = CreateObject( "ADODB.Connection" )
Set rs = CreateObject( "ADODB.Recordset" )
conn.Open dsn
rs.Open CreateObject( "WScript.Shell" ).CurrentDirectory + _
"\test.xml", conn
WalkHier iLevel, rs
rs.Close
conn.Close
Sub WalkHier(ByVal iLevel, ByVal rs)
iLevel = iLevel + 1
Dim PriorLevel : PriorLevel = iLevel
Dim i, adoChildRS
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
If rs.Fields(i).Name <> "$Text" Then
If rs.Fields(i).Type = adChapter Then
Set adoChildRS = rs.Fields(i).Value
WalkHier iLevel, adoChildRS
Else
wscript.echo iLevel & ": rs.Fields(" & i & ") = " & _
rs.Fields(i).Name & " = " & rs.Fields(i).Value
End If
End If
Next
rs.MoveNext
Wend
iLevel = PriorLevel
End Sub
Reading CSV Data
dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='s:\scripts\';Extended Properties=""text;HDR=Yes;FMT=Delimited(,);"""
query = "SELECT * FROM test.csv"
Set conn = CreateObject("ADODB.Connection")
Set cmd = CreateObject("ADODB.Command")
Set rs = CreateObject("ADODB.Recordset")
conn.Open dsn
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockReadOnly
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = query
rs.Open cmd
If Not(rs.BOF And rs.EOF) Then
Do Until rs.EOF
For i = 0 to rs.Fields.Count - 1
wscript.echo rs(i).name & " = " & rs(i).value
Next
rs.MoveNext
Loop
Else
wscript.echo "error: no records found"
End If
rs.Close
conn.Close
Set rs = Nothing
Set cmd = Nothing
Set conn = Nothing
Subscribe to:
Posts (Atom)