(powershell) Select-String 与 Findstr

(powershell) Select-String vs Findstr

这很简单...为什么第一个命令有效而第二个命令无效?

Findstr 在我看来最好用在 "dos" 类似的命令中,而不是在 powershell 中。

Get-AppXProvisionedPackage -online | findstr ^DisplayName

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

powershell 新手:)

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

这将 return 一个具有单个 属性 DisplayName 的新对象。要获取 属性 only 的值,您可以使用:

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

(另见

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

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

都是原生方式。

正如briantist所说,powershell cmdlet的常规return是一个对象,显示为"beautifully"。所以 findstr 将从控制台获取该输出并对其进行过滤。

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

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

Get-AppXProvisionedPackage -online | select "DisplayName"

从该命令中,输出将是第一个 Cmdlet return 编辑的对象的 属性。如果你想要纯字符串,你应该使用 select (Select-Object) Cmdlet 的“-ExpandProperty”参数。

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