2014-08-29 3 views
1

Я хотел бы получить только строки из окна net use cmd, которые для меня важны.Windows net use line break

если 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

Пример использования нетто: enter image description here

выход [ 'Getrennt \\ 192,168. 1.111 \ bze \ export ',' Microsoft Windows Network ', ' OK \\ master \ bze \ export Microsoft Windows Network ']

я хотел бы иметь выход в первой из одной линии, как на «OK .....»

ТНХ

+0

Вы достаточно хорошо описали свою ситуацию. Я понимаю, что вы хотите написать программу, которая объединяет строку «Getrennt» со следующей строкой. Тем не менее, в вашем сообщении отсутствует ключевой ингредиент: вопрос. У вас есть конкретный вопрос? –

+1

Рассмотрите запрос подключенных сетевых подключений напрямую через код ('WNetOpenEnum' /' WNetEnumResource') вместо того, чтобы разбирать вывод текста команды 'net'. –

ответ

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. Но в конечном итоге это, вероятно, больше работает, а не меньше.

+2

@abarnett, первый пустой столбец не означает продолжения строки. Я запустил эту команду на своем ПК, и столбец статуса пуст для нескольких записей. Одна вещь, которую я заметил, по крайней мере в моем случае, - это удаленный столбец и столбцы сети, которые всегда заполняются. – user3885927

+0

@ user3885927: Полезная информация, спасибо. Но независимо от правила, как только вы это выясните, код легко писать. Если OP хочет, чтобы кто-то другой перепроектировал грамматику для вывода «net use», это не вопрос SO, а тем более вопрос программирования Python ... – abarnert

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:]