(powershell) Select-String против Findstr

Это очень просто... почему первая команда работает, а вторая нет?

Findstr выглядит для меня наилучшим образом в командах типа "dos", а не в powershell.

Get-AppXProvisionedPackage -online | findstr ^DisplayName

Get-AppXProvisionedPackage -online | Select-String -pattern "DisplayName"

PowerShell новичок:)

2 ответа

Решение

findstr исполняемый файл операционной системы (findstr.exe на самом деле), который вы можете увидеть из PowerShell:

Get-Command findstr

Выход:

CommandType     Name                                               Version    Source                                   
-----------     ----                                               -------    ------                                   
Application     findstr.exe                                        10.0.10... C:\WINDOWS\system32\findstr.exe

Select-String похож, но более мощный и является родным командлетом PowerShell

CommandType     Name                                               Version    Source                                   
-----------     ----                                               -------    ------                                   
Cmdlet          Select-String                                      3.1.0.0    Microsoft.PowerShell.Utility

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

Как указывал Матиас, за то, что вы делаете, вы, вероятно, хотите Select-Object:

Get-AppXProvisionPackage -online |Select-Object DisplayName

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

$pkg = Get-AppXProvisionPackage -online
$pkg.DisplayName

Оба являются родными способами.

Как сказал Бриантист, регулярное возвращение командлета powershell - это объект, который отображается "красиво". Так что findstr возьмет этот вывод из консоли и отфильтрует его

если вы используете Select-String, вы пытаетесь сопоставить строку "DisplayName", но входными данными для командлета являются объекты, а не строки.

Правильный способ сделать это (полная мощность оболочки) будет:

Get-AppXProvisionedPackage -online | select "DisplayName"

Исходя из этой команды, выводом будет свойство объекта, возвращаемого первым командлетом. Если вам нужна простая строка, вы должны использовать параметр "-ExpandProperty" для командлета select (Select-Object).

Get-AppXProvisionedPackage -online | select -ExpandProperty "DisplayName"
Другие вопросы по тегам