1

我试图使用字典来检查为特定 SQL 备份成功或失败列出的给定数量的服务器。到目前为止,我的问题是当我运行此代码时:

for serverChk in srvrDict['Server']:

它在每个新行上将服务器名称作为单个字符返回,例如:
S
E
R
V
E
R
所以在我的试用中,我看到这个“连接到T以检查操作系统版本时出错”,其中 T 是服务器名称的第一个字符。我似乎无法将手指放在它上面,我所做的所有搜索都让我提出了要求。谢谢!

class checkstatus:
#def getServers(self):
    chkbkpstats = csv.reader(file('c://temp//networkerservers.csv'))
    for row in chkbkpstats:
        srvrDict = {}
        srvrDict['Server'] = row[0]
        srvrDict['Instance'] = row[1]
        print srvrDict

for serverChk in srvrDict['Server']:
        try:
            c = wmi.WMI(server)
            for os in c.Win32_OperatingSystem():
                osVer = os.caption
        except:                 
            print 'Error connecting to %s to check OS version' % serverChk

        if '2003' in osVer:
            print 'w2k3'
        if '2008' in osVer:
            print 'w2k8'
4

3 回答 3

2

我想您已经在字典中存储了一个字符串。所以该行for serverChk in srvrDict['Server']转换为for serverChk in yourSavedString。这就是为什么您要获得单个字符的原因。要访问单个字典项,您应该执行for k,v in srvrDict.iteritems()wherek是键和v是值的操作。

于 2012-09-06T19:24:36.620 回答
1

您在循环的每次迭代中都覆盖了ServerInstance值,而不是像您期望的那样实际为日志文件中的每个项目生成一个包含条目的数据序列。您需要创建一个包含字典的列表,并将其附加到每次迭代中。您可能正在寻找类似的东西:srvrDictchkbkpstats

chkbkpstats = csv.reader(file('c://temp//networkerservers.csv'))
srvrs = []
for for row in chkbkpstats:
    srvrs.append({'Name' : row[0], 'Instance' : row[1]})
for srvr in srvrs:
    try:
        c = wmi.WMI(srvr['Instance'])
    except:                 
        print 'Error connecting to %s to check OS version' % srvr['Name']
    else:
        osVer = c.Win32_OperatingSystem()[0].Caption
        if '2003' in osVer:
            print 'w2k3'
        elif '2008' in osVer:
            print 'w2k8'
于 2012-09-06T19:23:48.723 回答
1

您的代码存在一些问题。

srvrDict首先,每次执行第一个循环时都创建一个新的for,覆盖上次存储在此变量中的值。我认为,您实际上打算做的是:

srvrDict = {}
for row in chkbkpstats:
    srvrDict[row[0]] = row[1]

现在,srvrDict将包含一个条目,如{'P1RT04': ['THP06ASU']}中的每一行chkbkpstats,将服务器名称映射到该服务器上运行的实例列表。

然后,在第二个循环中,使用for serverChk in srvrDict:迭代字典中的所有条目。但是,我不确定变量serverinc = wmi.WMI(server)来自哪里。如果这是row[1]第一个循环中的内容,那么您应该使用srcvDict[serverChk]从字典中检索值。

这样,整个过程将如下所示:

chkbkpstats = csv.reader(file('c://temp//networkerservers.csv'))
srvrDict = {}
for row in chkbkpstats:
    name, instance = row[0], row[1]
    if name not in srvrDict:
        srvrDict[name] = []
    srvrDict[name].append(instance)

for server in srvrDict:
    for instance in srvrDict[server]:
        try:
            c = wmi.WMI(instance)
        except:                 
            print 'Error connecting to %s to check OS version' % server
        else:
            osVer = c.Win32_OperatingSystem()[0].caption
            if '2003' in osVer:
                print 'w2k3'
            elif '2008' in osVer:
                print 'w2k8'
            else:
                print 'unknown OS'

PS.:我不确定c.Win32_OperatingSystem(). [...]更新:感谢 sr2222 指出这一点。代码已修复。

更新:编辑代码以允许一台服务器托管多个实例。

于 2012-09-06T19:34:02.747 回答