5

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

Findstr 在我看来最适合在“dos”之类的命令中使用,而不是在 powershell 中。

Get-AppXProvisionedPackage -online | findstr ^DisplayName

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

PowerShell新手:)

4

2 回答 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 cmdlet 通常返回具有各种属性的对象,并且您看到的风格化格式用于显示,但您可以通过编程方式访问属性,而无需使用字符串解析。Select-Object是一种方式,另一种是使用点.表示法:

$pkg = Get-AppXProvisionPackage -online
$pkg.DisplayName
于 2016-08-05T15:21:22.520 回答
2

两者都是原生方式。

就像 briantist 所说,powershell cmdlet 的常规返回是一个对象,它被“漂亮地”显示出来。因此 findstr 将从控制台获取该输出并对其进行过滤。

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

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

Get-AppXProvisionedPackage -online | select "DisplayName"

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

Get-AppXProvisionedPackage -online | select -ExpandProperty "DisplayName"
于 2018-02-01T21:51:50.647 回答