Select-String 和 Findstr 的区别

6

这很简单...为什么第一个命令可以工作而第二个不行?

在我的看法中,Findstr最适合于“dos”类命令,而不是PowerShell。

Get-AppXProvisionedPackage -online | findstr ^DisplayName

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

PowerShell新手 :)


2
Get-AppXProvisionPackage -online |Select-Object DisplayName - Mathias R. Jessen
所以选择对象就是它 :) 谢谢 - AnimaliX
另一个选项是将输出作为字符串流传递,然后进行搜索。 Get-AppXProvisionedPackage -online | Out-String -Stream | Select-String -pattern "DisplayName" - Oz Edri
2个回答

7

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

这将返回一个新的对象,其中只有一个属性DisplayName。要仅获取属性值,您可以使用:

Get-AppXProvisionPackage -online | Select-Object -ExpandProperty DisplayName

(另请参见CapitanShinChan的回答)

PowerShell cmdlets经常返回具有各种属性的对象,您看到的样式化格式是用于显示的,但是可以在不使用字符串解析的情况下以编程方式访问属性。 Select-Object是一种方法,另一种方法是使用点.符号:

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

更加精确地说,Select-Object -ExpandProperty <prop> 与上面的点符号表示法类似。 - Timo
1
@Timo 是的,正确的,已更新。我还建议给CaptianShinChan解答点赞,他讲得很清楚。 - briantist

2

两种方法都是本地的。

正如briantist所说,powershell cmdlet的常规返回值是一个对象,这个对象会被“美妙地”显示出来。因此,findstr将从控制台获取该输出并进行过滤。

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

正确的方法(完整的powershell)应该是:

Get-AppXProvisionedPackage -online | select "DisplayName"

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接