我是powershell的新手。今天我尝试了一些非常简单的内容。
Alias | sls -Pattern 'echo'
这段内容想表达的是,我希望将echo
命令重定义为Alias echo -> Write-Out
。在Bash中,你可以直接执行以下命令:
alias | grep 'echo'
我的问题是为什么
sls
不能工作。顺便说一下,如果我用findstr
替换sls
,它可以工作。我是powershell的新手。今天我尝试了一些非常简单的内容。
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
命令的 -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
是一个传统的应用程序(在命令提示符中使用,其中命令使用文本解析)。因此,当您将结果导入该应用程序时,PowerShell会将其转换为字符串并进行处理。PowerShell本身在对象级别上工作。如Lee所述,以上已经解释了在 PowerShell 中的使用方法 :) - Frode F.