为什么SLS(即Select-String)无法工作?

6

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

Alias  | sls -Pattern 'echo'

这段内容想表达的是,我希望将echo命令重定义为Alias echo -> Write-Out。在Bash中,你可以直接执行以下命令:

alias | grep 'echo'

我的问题是为什么sls不能工作。顺便说一下,如果我用findstr替换sls,它可以工作。
2个回答

4
如果您想使用特定名称获取别名,可以执行以下操作:
alias -name echo
echo -> Write-OutDisplayName
(alias -name echo).DisplayName
Get-Alias 命令返回一系列对象,每个对象代表一个命令别名。在 PowerShell 中显示时,这些对象被格式化为包含 CommandTypeNameModuleName 属性的表格。
当您将其管道传递到 findstr 时,被过滤的是这些列的字符串表示形式,因此任何匹配都会显示整个表格行:
Alias           echo -> Write-Output

当您使用管道符号传递到 Select-String 时,每个对象都将绑定到 Select-String 命令的 -InputObject 参数。由于 Select-String 操作的是文本,因此它只需调用接收对象的 ToString 方法以获取其字符串表示形式。 ToString 只返回 Name 属性。您可以通过执行以下操作来查看这一点:
alias | %{$_.tostring()}

因此,Select-String 中的任何匹配都只针对别名名称进行匹配。

3
findstr 是一个传统的应用程序(在命令提示符中使用,其中命令使用文本解析)。因此,当您将结果导入该应用程序时,PowerShell会将其转换为字符串并进行处理。PowerShell本身在对象级别上工作。如Lee所述,以上已经解释了在 PowerShell 中的使用方法 :) - Frode F.

4

select-string只有在用于文本文件时才像grep一样。使用PowerShell对象时,行为会发生变化(正如Lee在他的答案中所解释的那样)。

可以通过以下方式演示:

alias > out.txt; cat out.txt | sls -pattern 'echo'

现在sls正在操作一个文本文件,因此返回Alias echo -> Write-Output

做你想要的另外两种解决方案:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接