Выберите строку, чтобы отобразить только определенную часть возвращаемой строки - PullRequest
3 голосов
/ 11 августа 2011

Я пытаюсь получить в Powershell командные команды select-string, чтобы они возвращали только то, что я ищу, плюс некоторую дополнительную информацию в конце.Вот что у меня есть:

PS H:\> gwmi win32_LoggedOnUser -computer server | select-string -pattern "domain" | select-string -pattern "Admin" -NotMatch

\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user1\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"44946387\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user2\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"41485153\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user3\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"46401036\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user4\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"40161073\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user5\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"46557830\""

Итак, я получил то, что искал, но я хочу сократить то, что фактически показывает мне команда.Желательно видеть только:

Domain\user1
Domain\user2

Но я не знаю, как это сделать.Самое близкое, что я получил, это добавление еще одной команды «Выбрать соответствия» в конец.Я читал, что регулярное выражение может быть ответом на мои проблемы.

Заранее благодарен за любую помощь.

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Пожалуйста, используйте что-то вроде ниже:

(gwmi win32_LoggedOnUser) | %{[void]($_.Antecedent -match 'Domain="(\w+)",Name="(\w+)"'); "{0}\{1}" -f $matches[1],$matches[2]}

Избегайте использования такого количества select-string - это похоже на bash со всем вуду grep, sed, awk, cut, которого, я считаю, Powershell избегает с объектами высокой точности. Старайтесь максимально использовать Объекты и их свойства. Да, их не всегда возможно использовать, и мы прибегаем к select-string или другим манипуляциям со строками, но стараемся избегать их до последнего возможного шага. Делает программирование Powershell аккуратным, простым и без ошибок IMO.

0 голосов
/ 11 августа 2011

Посмотрите, дает ли это то, что вы хотите:

gwmi win32_LoggedOnUser -computer server | select-string -pattern "domain" | select-string -pattern "Admin" -NotMatch | Select-Object @{n='Result'; e={$_ -match '.*Domain=\\"(\w*)\\.*Name=\\"(\w*)\\.*' | Out-Null; $matches[1] + '\' + $matches[2]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...