(powershell)Select-String vs Findstr

时间:2016-08-05 15:18:15

标签: powershell findstr select-string

这很简单......为什么第一个命令工作而第二个没有?

Findstr看起来最好用在" dos"喜欢命令而不是PowerShell。

Get-AppXProvisionedPackage -online | findstr ^DisplayName

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

powershell新手:)

2 个答案:

答案 0 :(得分:5)

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 cmdlet

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

虽然它们的工作方式不完全相同或采取相同的输入。 Select-String通常更适合在PowerShell中使用,但请查看帮助以了解它的工作原理。

正如Mathias所指出的那样,你可能想要Select-Object

Get-AppXProvisionPackage -online |Select-Object DisplayName

PowerShell cmdlet通常返回具有各种属性的对象,您看到的样式化格式用于显示,但您可以以编程方式访问属性而无需使用字符串解析。 Select-Object是单向的,另一种是使用点.表示法:

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

答案 1 :(得分:0)

两者都是本土方式。

就像briantist所说,powershell cmdlet的定期返回是一个“精美”显示的对象。所以findstr将从控制台获取该输出并过滤它。

如果使用Select-String,则尝试匹配字符串“DisplayName”,但Cmdlet的输入是对象,而不是字符串。

正确的方法(全功率shell)将是:

Get-AppXProvisionedPackage -online | select "DisplayName"

从该命令,输出将是第一个Cmdlet返回的对象的属性。如果你想要普通的字符串,你应该使用“-ExpandProperty”参数来选择(Select-Object)Cmdlet。

Get-AppXProvisionedPackage -online | select -ExpandProperty "DisplayName"