Select-String показывает строку, которая не существует в исходном выводе - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь выяснить, какой IP и интерфейс используется машиной Windows для связи с другой машиной.

Это команда, которую я выполняю:

Find-NetRoute -RemoteIpAddress 192.168.1.10 | Select-String -Pattern "IPAddress"

И это ответ:

MSFT_NetIPAddress (Name = ";C?8;@B8:8;::55?55;55;", CreationClassName = "", SystemCreationClassName = "", SystemName = "")

Я не понимаю этот вывод, потому что вывод Find -NetRoute без Select-String таков:

IPAddress         : 192.168.0.100
InterfaceIndex    : 4
InterfaceAlias    : Wi-Fi
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Dhcp
SuffixOrigin      : Dhcp
AddressState      : Preferred
ValidLifetime     : 01:10:34
PreferredLifetime : 01:10:34
SkipAsSource      : False
PolicyStore       : ActiveStore


Caption            :
Description        :
ElementName        :
InstanceID         : :8:8:8:9:55>55;C<8;@B8:8<?>55;
AdminDistance      :
DestinationAddress :
IsStatic           :
RouteMetric        : 0
TypeOfRoute        : 3
AddressFamily      : IPv4
CompartmentId      : 1
DestinationPrefix  : 0.0.0.0/0
InterfaceAlias     : Wi-Fi
InterfaceIndex     : 4
InterfaceMetric    : 50
NextHop            : 192.168.0.254
PreferredLifetime  : 02:00:00
Protocol           : NetMgmt
Publish            : No
State              : Alive
Store              : ActiveStore
ValidLifetime      : 02:00:00
PSComputerName     :
ifIndex            : 4

Действительно ли Select-String должен работать подобно "grep" в Windows Powershell?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

Помимо | findstr /i, есть еще один, вероятно, не такой удобный обходной путь. Вы можете сократить -stream до -s.

Find-NetRoute -RemoteIpAddress 192.168.1.10 | Out-String -Stream | Select-String ipaddress

IPAddress         : 192.168.0.100


Вы можете искать имена свойств с помощью select-object:

Find-NetRoute -RemoteIpAddress 192.168.1.10 | select *address*

Я могу sh Я мог бы искать значения свойств, как это, но, к сожалению, это не работает:

Find-NetRoute -RemoteIpAddress 192.168.1.10 | where * -match 192

Я полагаю, это работает, но все равно выводит все свойства. По крайней мере, он выводит только совпадающие объекты.

Find-NetRoute -RemoteIpAddress 192.168.1.10 | where { $_ -match '192' } 

[pscustomobject]@{name='joe';address='here'},
[pscustomobject]@{name='james';address='there'} | where { $_ -match 'th' }

name  address
----  -------
james there

РЕДАКТИРОВАТЬ:

Я создал скрипт "search-object", который возвращает только совпадающие свойства (и методы) по имени или значение:

# search-object.ps1

param ($pattern)

begin {
  $hash = @{}
}

process {
  $obj = $_

  $obj | Get-Member | foreach name | 
  foreach {
    $name = $_
    $value = $obj.$name
    if ($name -match $pattern -or $value -match $pattern) {
      $hash += @{$name = $value}
    }
  }
  [pscustomobject]$hash
}

Например:

get-process cmd | search-object cmd


Modules         : {System.Diagnostics.ProcessModule (cmd.exe), System.Diagnostics.ProcessModule
                  (ntdll.dll), System.Diagnostics.ProcessModule (KERNEL32.DLL),
                  System.Diagnostics.ProcessModule (KERNELBASE.dll),
                  System.Diagnostics.ProcessModule (msvcrt.dll)}
Path            : C:\Windows\System32\cmd.exe
MainModule      : System.Diagnostics.ProcessModule (cmd.exe)
ProcessName     : cmd
Name            : cmd
MainWindowTitle : cmd
Find-NetRoute -RemoteIpAddress 192.168.1.10 | search-object ipaddress

IPAddress
---------
192.168.0.100
0 голосов
/ 03 февраля 2020

Вот что я думаю происходит. Как утверждает @Lee_Dailey, Select-String работает с [String] экземплярами. Find-NetRoute выводит [CimInstance] instances ...

PS> Find-NetRoute -RemoteIpAddress 192.168.1.10 | ForEach-Object { $_.PSObject.TypeNames[0] }
Microsoft.Management.Infrastructure.CimInstance#ROOT/StandardCimv2/MSFT_NetIPAddress
Microsoft.Management.Infrastructure.CimInstance#ROOT/StandardCimv2/MSFT_NetRoute

... поэтому необходимо выполнить некоторое преобразование в [String], чтобы можно было искать текст. Если вы запустите это ...

PS> Find-NetRoute -RemoteIpAddress 192.168.1.10 | ForEach-Object { [String] $_ }
MSFT_NetIPAddress (Name = ";C?8;@B8:8;::55?55;55;", CreationClassName = "", SystemCreationClassName = "", SystemName = "")
MSFT_NetRoute (InstanceID = ":8:8:8:9:55>55;C<8;@B8:8<?>55")

... вы получите [String] представление MSFT_NetIPAddress и MSFT_NetRoute [CimInstance] экземпляров. Если вы прикрепите оригинальную команду Select-String к этому ...

PS> Find-NetRoute -RemoteIpAddress 10.10.10.10 | ForEach-Object { [String] $_ } | Select-String -Pattern IPAddress

MSFT_NetIPAddress (Name = ";C?8;@B8:8;::55?55;55;", CreationClassName = "", SystemCreationClassName = "", SystemName = "")

... вы получите исходный вывод, в котором отсутствует строка MSFT_NetRoute. Имя класса CIM MSFT_NetIPAddress соответствует шаблону IPAddress, поэтому эта строка присутствует в выходных данных.

Сначала я подумал, что он не приводит входные объекты к [String], а вызывает ToString() на них, и это то, что документация предлагает ...

Входы

System.Management .Automation.PSObject

Вы можете передать любой объект, имеющий метод ToString , на Select-String.

... но если я это сделаю что я получаю другой текст для MSFT_NetIPAddress экземпляра ...

PS> Find-NetRoute -RemoteIpAddress 192.168.1.10 | ForEach-Object { $_.ToString() }
192.168.0.100
MSFT_NetRoute (InstanceID = ":8:8:8:9:55>55;C<8;@B8:8<?>55")

Если вы просматриваете эту документацию, есть некоторые упоминания о ее схожести или работе как, например, grep и findstr , Проблема здесь, однако, заключается в том, что вводимый текст искал не то, что вы думали; текст, который вы видели в консоли из простой команды Find-NetRoute, был не тем текстом, который передавался бы Select-String по конвейеру.

Кстати, если вы намеревались просто отфильтровать вывод вплоть до того первого свойства IPAddress, которое отображается Find-NetRoute -RemoteIpAddress 192.168.1.10, затем вместо поиска по полному тексту IPAddress вы можете просто «найти» соответствующие свойства (под) имен с Select-Object ...

PS> Find-NetRoute -RemoteIpAddress 192.168.1.10 | Select-Object -Property '*IPAddress*'

IPAddress
---------
192.168.0.100
0 голосов
/ 03 февраля 2020

Когда "Grepping" в PS, я склонен опираться на findstr.

Попробуйте это:

find-netroute -remoteipaddress 10.0.0.1 | findstr "IPAddress"

Для меня (это мой IP-адрес шлюза) возвращается:

IPAddress         : 10.0.0.136

И, к вашему сведению, ваш синтаксис дал мне те же данные из InstanceID.

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