Вот что я думаю происходит. Как утверждает @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