我正在寻找一种可能的方法,让脚本从服务器获取所有系统DSN,以及获取实例上的所有SQL数据库,并比较这两个实例,以确保在此服务器上安装了所有DSN。我有一个脚本来获取DSN,我有一个单独的脚本来获取SQL的。
DSN脚本:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\ODBC\ODBC.INI\ODBC DATA SOURCES"
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
For i = 0 to Ubound(arrValueNames)
strValueName = arrValueNames(i)
If LEFT(strValueName, 2) = "SB" Then
objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
strDSN = strDSN & strValueName & VBCRLF
End If
Next
wscript.echo strDSNSQL DB脚本:
dim sServer, sConn, oConn, colDatabases, sDatabaseName, sUser, sPassword, strQry, run, rslt
sDatabaseName="Master"
sServer="."
sUser="."
sPassword="."
sConn="provider=sqloledb;data source=" & sServer & ";initial catalog=" & sDatabaseName
Set oConn = CreateObject("ADODB.Connection")
oConn.Open sConn, sUser, sPassword
strQry = "select name from sys.databases where name like 'sb%'"
set run = oConn.execute(strQry)
run.MoveFirst
Do Until run.EOF
rslt = rslt & "Database: " & run("name") & VBCRLF
run.MoveNext
Loop
MsgBox rslt
oConn.Close我可以单独运行这两个程序,并亲自比较它们,但是我希望能够合并它们,让脚本比较它们,并给出可能缺少的内容的反馈。
发布于 2014-09-05 18:00:15
您需要将DSN(名称)和数据库(名称)收集到两个数组中,即ArrayLists或Dictionaries。然后可以使用标准集操作(并、交、差、补)来识别感兴趣的(子)集,例如没有对应数据库的DSNs、没有对应DSN的数据库、'good‘对、.)。
只需两行就可以在第一个脚本中添加字典:
Set dicODBC = CreateObject("Scripting.Dictionary") ' <<<<<<<<
For i = 0 to Ubound(arrValueNames)
strValueName = arrValueNames(i)
If LEFT(strValueName, 2) = "SB" Then
objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
strDSN = strDSN & strValueName & VBCRLF
dicODBC(strValueName) = 0 ' <<<<<<<<
End If
Next您当然可以将此策略应用于您的第二个脚本,并将两个程序组合成一个以两个集合(字典) dicODBC和dicDB结尾的程序(确保其键不包括"Database:“前缀)。
现在看一下this脚本,看看如何比较通过dicX.Keys()获得的数组。
https://stackoverflow.com/questions/25689397
复制相似问题