5

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

Alias  | sls -Pattern 'echo'

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

在 bash 中,你可以这样做

alias | grep 'echo'

我的问题是为什么sls不起作用。顺便说一句,如果我用 替换slsfindstr它会起作用。

4

2 回答 2

3

如果您想获得具有特定名称的别名,您可以执行以下操作:

alias -name echo

echo -> Write-OutDisplayName:_

(alias -name echo).DisplayName

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

当您通过管道输入findstr时,将过滤这些列的字符串表示形式,因此任何匹配都会显示整个表格行:

Alias           echo -> Write-Output

当您通过管道进入Select-String每个对象时,都会绑定到cmdlet的-InputObject参数。Select-String由于Select-String对文本进行操作,它只调用ToString接收到的对象来获取其字符串表示。

ToString只返回Name属性。您可以通过执行以下命令来看到这一点:

alias | %{$_.tostring()}

因此,来自Select-String仅匹配别名的任何匹配项。

于 2013-09-01T12:50:22.037 回答
3

select-stringgrep与文本文件一起使用时的行为。使用 powershell 对象时,行为会发生变化(正如 Lee 在他的回答中所解释的那样)。

这可以通过以下方式证明:

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.

于 2017-01-24T21:44:38.433 回答