这很简单......为什么第一个命令工作而第二个没有?
Findstr看起来最好用在" dos"喜欢命令而不是PowerShell。
Get-AppXProvisionedPackage -online | findstr ^DisplayName
Get-AppXProvisionedPackage -online | Select-String -pattern "DisplayName"
powershell新手:)
答案 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"