Windows net use 换行符
我想从Windows的net use命令中只获取对我有用的行。
如果UNC路径太长,net use会换行。
我的代码是:
output = subprocess.Popen('net use', stdout=subprocess.PIPE).communicate()
valid_lines = [ line.strip() for line in output[0].split('\r\n')]
valid_lines = valid_lines[6:-3]
print "output", valid_lines
net use的示例:

输出结果是 ['Getrennt \\192.168.1.111\bze\export', 'Microsoft Windows Network', 'OK \\master\bze\export Microsoft Windows Network']
我希望输出的结果能从第一行开始,就像'OK.....'那样。
谢谢
2 个回答
正如Andrew Medico所提到的,这里有一些API可以使用。如果可能的话,调用一个专门为程序返回信息的函数要比解析人类格式化的输入要好得多(因为后者可能会复杂得多,正如你在这里看到的,甚至可能会让人困惑)。
不过,这件事是可以做到的。你只需要弄清楚什么规则适用于换行。
看起来规则很简单:如果第一列是空的,那么这一行就是上一行的继续。
如果是这样的话:
prev_line = ''
for line in valid_lines:
if line[0]:
if prev_line:
print prev_line
prev_line = ''
else:
prev_line += line
你可以用itertools.groupby
让代码更简洁,也更容易被很多人理解,但这可能会让初学者感到困惑,所以我选择了更明确的循环方式。
你也可以通过使用一个与换行格式兼容的协议解析器来“作弊”;例如,rfc822
模块。但最终,这样做可能会让事情变得更复杂,而不是更简单。
这是个好问题,我找到了一种更好、更可靠的方法来解决这个问题,前提是你的操作系统支持WMIC命令。我相信从Windows XP开始就支持这个命令,但你可以检查一下你具体的系统是否支持。使用WMIC,你可以把输出格式化为CSV,这样你就能得到完全可靠的信息。下面是示例代码:
import subprocess
output = subprocess.Popen('wmic netuse list /format:csv', stdout=subprocess.PIPE).communicate()
valid_lines = [ line.strip() for line in output[0].split('\r\n')]
#If you don't want the header use 2: instead of 1:
myData=[line.split(',') for line in valid_lines][1:]