我是powershell的新手。今天我尝试了一些非常简单的东西
Alias | sls -Pattern 'echo'
哪个产生了echo
,但我想要的是Alias echo -> Write-Out
。
在 bash 中,你可以这样做
alias | grep 'echo'
我的问题是为什么sls
不起作用。顺便说一句,如果我用 替换sls
,findstr
它会起作用。
我是powershell的新手。今天我尝试了一些非常简单的东西
Alias | sls -Pattern 'echo'
哪个产生了echo
,但我想要的是Alias echo -> Write-Out
。
在 bash 中,你可以这样做
alias | grep 'echo'
我的问题是为什么sls
不起作用。顺便说一句,如果我用 替换sls
,findstr
它会起作用。
如果您想获得具有特定名称的别名,您可以执行以下操作:
alias -name echo
echo -> Write-Out
是DisplayName
:_
(alias -name echo).DisplayName
该Get-Alias
命令返回一系列对象,每个对象代表一个命令别名。在 powershell 中显示时,这些对象被格式化为包含CommandType
,Name
和ModuleName
属性的表格。
当您通过管道输入findstr
时,将过滤这些列的字符串表示形式,因此任何匹配都会显示整个表格行:
Alias echo -> Write-Output
当您通过管道进入Select-String
每个对象时,都会绑定到cmdlet的-InputObject
参数。Select-String
由于Select-String
对文本进行操作,它只调用ToString
接收到的对象来获取其字符串表示。
ToString
只返回Name
属性。您可以通过执行以下命令来看到这一点:
alias | %{$_.tostring()}
因此,来自Select-String
仅匹配别名的任何匹配项。
select-string
仅grep
与文本文件一起使用时的行为。使用 powershell 对象时,行为会发生变化(正如 Lee 在他的回答中所解释的那样)。
这可以通过以下方式证明:
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
.