尝试在命令输出中搜索字符串

时间:2015-04-28 13:08:00

标签: windows python-2.7

我正在编写一个脚本来运行PSinfo(来自Sysinternals套件)对一个机器列表,然后我想在做其他事情之前搜索输出中的特定字符串。基本代码如下:

with open ("specific-pcs.txt") as machines:
    line = []
    for machineName in machines:
        machineName = machineName.strip()

        ps_Info = subprocess.Popen("location of PsInfo \\" + machineName + " -s").communicate()[0]

        if ("Silverlight" in ps_Info):
            subprocess.Popen("wmic product where caption='Microsoft Silverlight' call uninstall")
            print "Uninstalling Silverlight"
        else:   
            pass

PsInfo的输出如下所示:

Microsoft Office Word MUI (English) 2010 14.0.7015.1000
Microsoft ReportViewer 2010 Redistributable 10.0.30319
Microsoft Silverlight 5.1.10411.0
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148 9.0.30729.4148
Realtek High Definition Audio Driver 6.0.1.7004

但按原样运行代码,它会抱怨"' Nonetype'是不可迭代的#34;。 我需要它做的就是说Silverlight(在这种情况下)是否存在于输出中。 我需要改变什么?

谢谢,克里斯。

1 个答案:

答案 0 :(得分:0)

如果未将流重定向到管道,

communicate会为流返回None,这意味着在您的情况下:

subprocess.Popen("location of PsInfo \\" + machineName + " -s").communicate()

将返回(None, None),并且在in上使用None运算符时会出现argument of type 'NoneType' is not iterable错误。

另外,在调用Popen而不是单个字符串时应该使用参数列表,所以这应该有效:

ps_Info = subprocess.Popen([r"C:\Path\To\PsInfo", r"\\" + machineName, "-s"],
                           stdout=subprocess.PIPE).communicate()[0]