(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"