为什么sls aka select-string不起作用

时间:2013-09-01 12:36:38

标签: powershell

我是powershell的新手。今天我尝试了一些非常简单的事情

Alias  | sls -Pattern 'echo'

产生了echo,但我想要的是Alias echo -> Write-Out

在bash中,你可以做到

alias | grep 'echo'

我的问题是为什么sls不起作用。顺便说一句,如果我用sls替换findstr,它就可以了。

2 个答案:

答案 0 :(得分:3)

如果您想获得具有特定名称的别名,您可以这样做:

alias -name echo

echo -> Write-OutDisplayName

(alias -name echo).DisplayName

Get-Alias命令返回一系列对象,每个对象代表一个命令别名。在powershell中显示时,这些对象被格式化为包含CommandTypeNameModuleName属性的表格。

当您管道进入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正在对文本文件进行操作。

做你想做的其他解决方案是:

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

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

    这会将powershell对象转换为字符串,以便slsgrep一样工作。