2013-09-01 35 views
2

我是powershell的新手。今天我想很簡單的東西爲什麼sls又名選擇字符串不起作用

Alias | sls -Pattern 'echo' 

它生產echo,但我要的是Alias echo -> Write-Out

在bash中,你可以做

alias | grep 'echo' 

我的問題是,爲什麼sls不起作用。順便說一句,如果我用findstr代替sls,它就起作用了。

回答

3

如果你想獲得具有特定名稱的別名,你可以這樣做:

alias -name echo 

echo -> Write-OutDisplayName

(alias -name echo).DisplayName 

Get-Alias命令返回的對象的序列,每個它代表一個命令別名。當在powershell中顯示時,這些對象被格式化爲包含CommandType,NameModuleName屬性的表格。

當通過管道進入findstr,它是正被過濾的這些列的字符串表示,所以任何匹配顯示整個錶行:

Alias   echo -> Write-Output 

當通過管道進入Select-String每個對象被綁定到Select-String cmdlet的參數-InputObject。由於Select-String對文本進行操作,因此它只會在接收到的對象上調用ToString以獲取其字符串表示形式。

ToString只返回Name屬性。您可以通過執行以下看到:

alias | %{$_.tostring()} 

因此從Select-String任何比賽只匹配的別名。

+0

我想我的問題是爲什麼'findstr'工作和'sls'不是? –

+0

@JohnSmith - 我更新了一個解釋 – Lee

+2

'findstr'是一個傳統的應用程序(在命令使用文本解析的cmd中使用)。所以當你將結果傳遞給它時,ps會轉換爲字符串並處理它。 powershell-cmdlet本身在對象級別上工作。 PS中的用法在Lee上面解釋過:) –

1

select-string與文本文件一起使用時的行爲與grep的行爲相同。使用PowerShell對象時,行爲會發生變化(正如Lee在他的回答中所解釋的)。

alias > out.txt; cat out.txt | sls -pattern 'echo' 

因爲現在sls是在一個文本文件中工作,這將返回Alias echo -> Write-Output

這可以證明。

其他的解決方案,做你想做的是:

  1. alias | where DisplayName -like '*echo*'

  2. alias | out-string -stream | sls -pattern 'echo'

    這PowerShell的對象轉換爲字符串,以便sls作品像grep

相關問題