我是powershell的新手。今天我想很簡單的東西爲什麼sls又名選擇字符串不起作用
Alias | sls -Pattern 'echo'
它生產echo
,但我要的是Alias echo -> Write-Out
。
在bash中,你可以做
alias | grep 'echo'
我的問題是,爲什麼sls
不起作用。順便說一句,如果我用findstr
代替sls
,它就起作用了。
我是powershell的新手。今天我想很簡單的東西爲什麼sls又名選擇字符串不起作用
Alias | sls -Pattern 'echo'
它生產echo
,但我要的是Alias echo -> Write-Out
。
在bash中,你可以做
alias | grep 'echo'
我的問題是,爲什麼sls
不起作用。順便說一句,如果我用findstr
代替sls
,它就起作用了。
如果你想獲得具有特定名稱的別名,你可以這樣做:
alias -name echo
的echo -> Write-Out
是DisplayName
:
(alias -name echo).DisplayName
的Get-Alias
命令返回的對象的序列,每個它代表一個命令別名。當在powershell中顯示時,這些對象被格式化爲包含CommandType
,Name
和ModuleName
屬性的表格。
當通過管道進入findstr
,它是正被過濾的這些列的字符串表示,所以任何匹配顯示整個錶行:
Alias echo -> Write-Output
當通過管道進入Select-String
每個對象被綁定到Select-String
cmdlet的參數-InputObject
。由於Select-String
對文本進行操作,因此它只會在接收到的對象上調用ToString
以獲取其字符串表示形式。
ToString
只返回Name
屬性。您可以通過執行以下看到:
alias | %{$_.tostring()}
因此從Select-String
任何比賽只匹配的別名。
select-string
與文本文件一起使用時的行爲與grep
的行爲相同。使用PowerShell對象時,行爲會發生變化(正如Lee在他的回答中所解釋的)。
alias > out.txt; cat out.txt | sls -pattern 'echo'
因爲現在sls
是在一個文本文件中工作,這將返回Alias echo -> Write-Output
:
這可以證明。
其他的解決方案,做你想做的是:
alias | where DisplayName -like '*echo*'
alias | out-string -stream | sls -pattern 'echo'
這PowerShell的對象轉換爲字符串,以便sls
作品像grep
。
我想我的問題是爲什麼'findstr'工作和'sls'不是? –
@JohnSmith - 我更新了一個解釋 – Lee
'findstr'是一個傳統的應用程序(在命令使用文本解析的cmd中使用)。所以當你將結果傳遞給它時,ps會轉換爲字符串並處理它。 powershell-cmdlet本身在對象級別上工作。 PS中的用法在Lee上面解釋過:) –