2016-08-05 73 views
2

這很簡單...爲什麼第一個命令工作,第二個不行?(powershell)選擇字符串與Findstr

Findstr在我看來最好的使用「DOS」命令而不是PowerShell。

Get-AppXProvisionedPackage -online | findstr ^DisplayName 

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

PowerShell的新手:)

+1

'GET-AppXProvisionPackage -online |選擇-對象DisplayName' –

+0

如此選擇,對象是:)謝謝 – AnimaliX

回答

4

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命令

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

他們不工作完全一樣,雖然還是採取同樣的輸入。 Select-String通常更適合在PowerShell中使用,但請查看幫助以瞭解其工作原理。

由於馬蒂亞斯指出的那樣,你在做什麼,你可能想Select-Object

Get-AppXProvisionPackage -online |Select-Object DisplayName 

PowerShell命令經常與各種屬性返回對象,你可以看到程式化的格式進行顯示,但是你可以以編程方式訪問屬性而不使用字符串解析。 Select-Object是一種方式,另一種是使用點.符號:

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

燁...土辦法,最好的辦法:)謝謝 – AnimaliX

0

兩者都是原生的方式。

就像briantist說的那樣,powershell cmdlet的正常返回是一個對象,它被「精美地」顯示出來。因此findstr將從控制檯獲取該輸出並對其進行過濾。

如果使用Select-String,則試圖匹配字符串「DisplayName」,但Cmdlet的輸入是對象,而不是字符串。

正確的方式做到這一點,(全PowerShell的)應該是:

Get-AppXProvisionedPackage -online | select "DisplayName" 

從這個命令,輸出將是第一個cmdlet返回的對象的屬性。如果您需要純字符串,則應對select(Select-Object)Cmdlet使用「-ExpandProperty」參數。

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