1

我只想从 windows net use cmd 中获取与我相关的行。

如果 UNC 路径是长网使用是否换行

我的代码:

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

样品净用途: 在此处输入图像描述

输出 ['Getrennt \\192.168.1.111\bze\export', 'Microsoft Windows Network', 'OK \\master\bze\export Microsoft Windows Network']

我想从第一行输出输出,比如'OK.....'

谢谢

4

2 回答 2

0

这是一个很好的问题,只要您的操作系统支持 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:]
于 2014-08-29T20:26:13.950 回答
0

正如 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模块。但最终这可能会做更多的工作而不是更少。

于 2014-08-29T19:55:16.793 回答