我正在编写一个脚本来运行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(在这种情况下)是否存在于输出中。 我需要改变什么?
谢谢,克里斯。
答案 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]