1

辞書を使用して、特定の SQL バックアップの成功または失敗についてリストされている特定の数のサーバーをチェックしようとしています。これまでの問題は、このコードを実行するときです。

for serverChk in srvrDict['Server']:

次のように、新しい行ごとにサーバー名を単一の文字として返します。
S
E
R
V
E
R
したがって、私の試行では、この「Tに接続してOS バージョンを確認する際のエラー」が表示されます。ここで、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()kは、 がキーでvが値です。

于 2012-09-06T19:24:36.620 に答える
1

コードにはいくつかの問題があります。

srvrDictまず、最初のループを通過するたびに新しい変数を作成forし、前回この変数に格納された値を上書きします。あなたが実際に意図したことは次のとおりだと思います。

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

これで、for each row のsrvrDictようなエントリが含まれ、サーバー名がそのサーバーで実行されているインスタンスのリストにマッピングされます。{'P1RT04': ['THP06ASU']}chkbkpstats

次に、2 番目のループで、 を使用for serverChk in srvrDict:してディクショナリ内のすべてのエントリを反復処理します。ただし、変数serverinがどこc = 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 に感謝します。コード修正。

更新: 1 つのサーバーで複数のインスタンスをホストできるようにコードを編集しました。

于 2012-09-06T19:34:02.747 に答える
1

ループの各反復でServerとのInstance値を上書きしています。実際には、ログ ファイル内の各項目のエントリを含む一連のデータを期待どおりに生成していません。各反復に追加する辞書を含むリストを作成する必要があります。おそらく次のようなものを探しているでしょう: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 に答える