我是powershell的新手。今天我尝试了一些非常简单的事情
Alias | sls -Pattern 'echo'
产生了echo
,但我想要的是Alias echo -> Write-Out
。
在bash中,你可以做到
alias | grep 'echo'
我的问题是为什么sls
不起作用。顺便说一句,如果我用sls
替换findstr
,它就可以了。
答案 0 :(得分:3)
如果您想获得具有特定名称的别名,您可以这样做:
alias -name echo
echo -> Write-Out
是DisplayName
:
(alias -name echo).DisplayName
Get-Alias
命令返回一系列对象,每个对象代表一个命令别名。在powershell中显示时,这些对象被格式化为包含CommandType
,Name
和ModuleName
属性的表格。
当您管道进入findstr
时,正在过滤这些列的字符串表示,因此任何匹配都会显示整个表格行:
Alias echo -> Write-Output
当您管道Select-String
时,每个对象都绑定到-InputObject
cmdlet的Select-String
参数。由于Select-String
对文本进行操作,因此只需在接收到的对象上调用ToString
即可获得其字符串表示。
ToString
仅返回Name
属性。您可以通过执行以下操作来查看:
alias | %{$_.tostring()}
因此Select-String
的所有匹配项仅匹配别名。
答案 1 :(得分:2)
select-string
的行为与grep
相同。使用PowerShell对象,行为会发生变化(正如李在他的回答中所解释的那样)。
这可以通过以下方式证明:
alias > out.txt; cat out.txt | sls -pattern 'echo'
返回Alias echo -> Write-Output
,因为现在sls
正在对文本文件进行操作。
做你想做的其他解决方案是:
alias | where DisplayName -like '*echo*'
alias | out-string -stream | sls -pattern 'echo'
这会将powershell对象转换为字符串,以便sls
像grep
一样工作。