PowerShell Select-String ничего не соответствует, несмотря на все попытки в TFM - PullRequest
1 голос
/ 14 января 2020

Каждый раз, когда я захожу в PowerShell, он всегда один и тот же. Некоторые случайные иероглифы, которые никогда не работают, как ожидалось. На этот раз я пытаюсь отфильтровать выходные данные Get-WindowsFeature, чтобы отобразить все строки, содержащие TIFF (таким образом, PS эквивалент | grep TIFF или | find /i "TIFF"). Это то, что я пробовал до сих пор, и вывод (пустой во всех случаях), и у меня, конечно, RTFM. Первые несколько строк показывают конец вывода Get-WindowsFeature, так что определенно есть по крайней мере одна совпадающая строка (6-я от конца):

Display Name                                   Name                    Install State
------------                                   ----                    -------------
[ ] Windows Search Service                     Search-Service          Available
[ ] Windows Server Backup                      Windows-Server-Backup   Available
[ ] Windows Server Migration Tools             Migration               Available
[ ] Windows Standards-Based Storage Management WindowsStorageManage... Available
[ ] Windows TIFF IFilter                       Windows-TIFF-IFilter    Available
[ ] WinRM IIS Extension                        WinRM-IIS-Ext           Available
[ ] WINS Server                                WINS                    Available
[ ] Wireless LAN Service                       Wireless-Networking     Available
[X] WoW64 Support                              WoW64-Support           Installed
[ ] XPS Viewer                                 XPS-Viewer              Available


PS C:\Windows\system32> get-windowsfeature | select-string "TIFF"
PS C:\Windows\system32> get-windowsfeature | select-string TIFF
PS C:\Windows\system32> get-windowsfeature | select-string 'TIFF'
PS C:\Windows\system32> get-windowsfeature | select-string -Pattern 'TIFF'
PS C:\Windows\system32> get-windowsfeature | select-string -Pattern 'TIFF' -AllMatches
PS C:\Windows\system32> get-windowsfeature | select-string -Pattern "TIFF"
PS C:\Windows\system32> get-windowsfeature | select-string -Pattern TIFF
PS C:\Windows\system32> Get-WindowsFeature | Select-String -Pattern TIFF
PS C:\Windows\system32> Get-WindowsFeature | Select-String -Pattern 'TIFF'
PS C:\Windows\system32> $A = Get-WindowsFeature | Select-String -Pattern 'TIFF'
PS C:\Windows\system32> $A
PS C:\Windows\system32> Get-WindowsFeature | Select-String -Pattern 'TIFF' -SimpleMatch
PS C:\Windows\system32> Get-WindowsFeature | Select-String -SimpleMatch 'TIFF'
PS C:\Windows\system32> Get-WindowsFeature |& Select-String -SimpleMatch 'TIFF'
PS C:\Windows\system32> Get-WindowsFeature | Select-String -SimpleMatch 'TIFF' 2>&1
PS C:\Windows\system32> Get-WindowsFeature 2>&1 | Select-String -SimpleMatch 'TIFF'
PS C:\Windows\system32> Get-WindowsFeature 3>&1 | Select-String -SimpleMatch 'TIFF'
PS C:\Windows\system32> 

Чтобы решить мою проблему, на этот раз я сдался и перенаправил вывод в файл, и использовать Блокнот, чтобы найти его. Но в следующий раз я все еще хотел бы знать, какой случайный набор символов необходим, чтобы заставить эту вещь работать.

Для дополнительного пояснения, вот ожидаемый выходной макет:

PS C:\Windows\system32> Get-WindowsFeature | Select-String <what exactly goes here?>
[ ] Windows TIFF IFilter                                Windows-TIFF-IFilter           Available

PS C:\Windows\system32>

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Я отредактировал заголовки обратно. Я подумал, что это мог быть какой-то странный пользовательский формат, такой как get-date. В любом случае, обычный способ фильтрации свойства в powershell выглядит следующим образом. Это похоже на sql. Это команда только для сервера:

get-windowsfeature | where displayname -match tiff
get-windowsfeature | where name -match tiff
get-windowsfeature | where installstate -eq installed

Не очень хорошо, что заголовок немного отличается от имени свойства здесь.

Неплохая идея - держать findstr в вашем наборе инструментов для подобных ситуаций. Обратите внимание, что findstr обычно чувствителен к регистру без опции '/ i':

get-windowsfeature | findstr TIFF
2 голосов
/ 14 января 2020

Ваша проблема в том, что вы неправильно поняли команду Select-String.

Как описано в документах Select-String:

Поиск текста в строках и файлах.

Ссылка: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7

Get-WindowsFeature не является ни строкой, ни файлом. В основном это какой-то объект, как и большинство других команд в PowerShell. Вы можете легко проверить с помощью:

(Get-WindowsFeature).getType()

У меня нет Windows Сервера, готового к тестированию, но мы также можем принять другую команду, такую ​​как Get-Alias

(Get-Alias).getType()

Вывод:

IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     Object[]  System.Array

Как видите, это массив, а Select-String работает с файлом или над строками.

Итак, интуитивно понятный способ - это то, что @ Lieven Keersmaekers сказал в комментарии:

Get-windowsfeature | ? {$_.Name -match 'TIFF'}

В случае примера с Get-Alias:

Get-Alias | ? {$_.DisplayName -match "Time"} 

Вывод:

CommandType     Name                    Version    Source
-----------     ----                    -------    ------
Alias           gtz -> Get-TimeZone     3.1.0.0    Microsoft.PowerShell.Management
Alias           stz -> Set-TimeZone     3.1.0.0    Microsoft.PowerShell.Management

Как видите, я взял DisplayName. Это потому, что Name имеет только gtz / stz, но я хочу найти текст рядом с ->.

Чтобы отобразить все поля, к которым у вас есть доступ, вы можете распечатать его (как упоминание от @ Lieven Keersmaekers в комментариях):

(Get-Alias)[0] | fl *

или в вашем случае:

(Get-WindowsFeature)[0] | fl *

Select-String

В случае с помощью Select-String есть два способа, которые также используются в упомянутой выше справочной странице.

Как уже упоминалось выше @ Lieven Keersmaekers , вы можете передать его в строку типа:

(Get-WindowsFeature | Out-String) -split "\r\n" | Select-String TIFF

Другой способ - распечатать его в файл и затем использовать Select. -Строка в файле:

Get-WindowsFeature | Out-File -FilePath .\Windows_Feature.txt
Select-String -Path .\Windows_Feature.txt -Pattern "TIFF"

В качестве замечания не забывайте: вы можете видеть его как строку, но для PowerShell это объект, и поэтому на нем невозможно использовать Select-String.

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