Разбор / форматирование строк с PowerShell - PullRequest
3 голосов
/ 19 мая 2011

Этот оригинальный вопрос не был о powershell.Я предполагаю следующие базовые предпосылки:

  • Мы работаем под управлением Windows 7
  • Мы хотим проанализировать результат утилиты systeminfo, поставляемой с Windows 7
  • Мы хотимИзвлеките информацию о сетевых адаптерах из выходных данных и поместите их в некоторую структуру данных для дальнейшей обработки.

Теперь я знаю, что есть более эффективные способы получения информации о сетевой карте, чем запуск systeminfo и анализ выходных данных.Мой интерес не в этой конкретной утилите.Я рассматриваю общую задачу анализа / форматирования некоторого текста в powershell.Я чувствую, что powershell хорошо подходит для такого рода задач, возможно, лучше, чем C # (в зависимости от конкретных требований).Вот почему я предлагаю мой ответ в PowerShell на оригинальный вопрос.

Мой вопрос, хотя это так.Я всегда чувствую, что некоторый синтаксис powershell немного громоздок. Как бы вы улучшили мой код? Обратите внимание, что код не должен возвращать точно такие же результаты в точно такой же структуре. Я ищу уловки, которые могут помочь с анализом / обработкой текста. Я снова и снова видел изобретательность сообщества в решении многих задач.Я видел простые решения сложных проблем, которые совсем не очевидны, пока кто-то не покажет вам, как это сделать.Вот почему я спрашиваю.

Вот код:

$networkCards = systeminfo | ForEach-Object {$a=0} {
    if ($_.startswith("Network Card(s)")) {$a=1} else {if ($a) {$_}}
}

$networkCards | ForEach-Object {$data=@{}} { 
    if ($_.trim().startswith("[")) {
        $c = $_.trim(); $data[$c] = @()} else {$data[$c] += $_.trim()
    } 
}

#Now we have a hash table with the keys as requested in the question 
#and the values are lists of separate strings, but those can be easily 
#concatenated if needed. Let's display it:
$data

Ответы [ 3 ]

1 голос
/ 19 мая 2011

Прежде всего, пожалуйста, прекратите использовать Powershell как обычный язык сценариев.

Использование объекта PowerShell и анализ строки - определенно НЕ хороший способ сделать то, что вы хотите. Я должен адаптировать ваш скрипт к моему языку, чтобы получить что-то в $ data

И для меня вещи здесь не имеют большого смысла, но вы создаете хеш-таблицу из массива, и я даю вам способ использовать ее.

Таким образом, чтобы использовать $ data, вы можете написать:

foreach ($key in $data.keys)
{
  write-Host ("The name is {0}, the value is {1}" -f $key, $data[$key])
}

В моем случае это дает:

The name is [02]: fe80::391a:2817:8f3e:6f2f, the value is System.Object[]
The name is [02]: Intel(R) WiFi Link 5300 AGN, the value is System.Object[]
The name is [02]: fe80::c70:cc38:cf64:eb27, the value is System.Object[]
The name is [01]: 192.168.183.1, the value is System.Object[]
The name is [01]: 192.168.0.3, the value is System.Object[]
The name is [03]: VMware Virtual Ethernet Adapter for VMnet1, the value is System.Object[]
The name is [05]: Microsoft Virtual WiFi Miniport Adapter, the value is System.Object[]
The name is [02]: fe80::5d48:c4a:5987:ee73, the value is System.Object[]
The name is [04]: VMware Virtual Ethernet Adapter for VMnet8, the value is System.Object[]
The name is [01]: 192.168.234.1, the value is System.Object[]
The name is [01]: Intel(R) 82567LM Gigabit Network Connection, the value is System.Object[]

Поскольку $ data [$ key] является массивом. Вы можете написать:

foreach ($key in $data.keys)
{
  write-Host ("The name is {0}" -f $key)
  foreach($line in $data[$key])
  {
    Write-Host ("`t$line")
  }
}

Для меня это дает:

The name is [02]: fe80::391a:2817:8f3e:6f2f
The name is [02]: Intel(R) WiFi Link 5300 AGN
    Nom de la connexion : Connexion réseau sans fil
    État :                Support déconnecté
The name is [02]: fe80::c70:cc38:cf64:eb27
The name is [01]: 192.168.183.1
The name is [01]: 192.168.0.3
The name is [03]: VMware Virtual Ethernet Adapter for VMnet1
    Nom de la connexion : VMware Network Adapter VMnet1
    DHCP activé :         Non
    Adresse(s) IP
The name is [05]: Microsoft Virtual WiFi Miniport Adapter
    Nom de la connexion : Connexion réseau sans fil 2
    État :                Support déconnecté
The name is [02]: fe80::5d48:c4a:5987:ee73
The name is [04]: VMware Virtual Ethernet Adapter for VMnet8
    Nom de la connexion : VMware Network Adapter VMnet8
    DHCP activé :         Non
    Adresse(s) IP
The name is [01]: 192.168.234.1
The name is [01]: Intel(R) 82567LM Gigabit Network Connection
    Nom de la connexion : Connexion au réseau local
    DHCP activé :         Oui
    Serveur DHCP :        192.168.0.254
    Adresse(s) IP
0 голосов
/ 19 мая 2011

Все говорят об объектах правильно. Идея состоит в том, чтобы передать объект из одного метода непосредственно в другой, а затем воздействовать на этот объект. Я не гуру в PS, но я начинаю понимать. Надеюсь, этот скрипт немного продвинет вас вперед.

$text = @"
key1:value1
key2:value2
key3:value3
"@
$map = @{}
($text -split "`n") | Where-Object {$_ -imatch 'key2'} | foreach-object {$tokens = $_ -split ":"; $map.Add($tokens[0],$tokens[1])}
$map
0 голосов
/ 19 мая 2011

Я попробую модерировать ответ выше :-):

Хотя Powershell можно использовать для анализа информации, например, systeminfo, есть намного лучшие интерфейсы для информации.Посмотрите на Get-WmiObject.В этом случае, кажется, на ум приходит Get-WmiObject Win32_NetworkAdapter или Win32_NetworkAdapterConfiguration.Также есть Win32_NetworkProtocol и Win32_NetworkConnection, которые могут предоставить вам необходимую информацию.

Объедините с Select-Object, Sort-Object и Format-Table, чтобы представить необходимые данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...