在PowerShell中,我尝试过:
alias | select-string Alias
即使失败 Alias
输出中明确显示。我知道这是因为select-string在某个对象上而不是实际的输出字符串上运行。
该怎么办?
在PowerShell中,我尝试过:
alias | select-string Alias
即使失败 Alias
输出中明确显示。我知道这是因为select-string在某个对象上而不是实际的输出字符串上运行。
该怎么办?
Answers:
我认为此解决方案更简单,更好,请直接使用功能findstr:
alias | findstr -i Write
您也可以使用grep单词作为别名:
new-alias grep findstr
-i
。如果显示带有findstr的帮助,findstr /?
它将显示所有带有正斜杠的选项/
。但是,它将接受以/
OR-'. For example
开头的参数ipconfig / all在功能上与相同ipconfig -all
。所以-i
是一样的/i
,自FINDSTR是一个古老的DOS程序,和老的DOS程序不关心的情况下,/i
是idential来/I
。所以这意味着这是一个案例敏感搜索。
Write
结尾。 alias
是的别名Get-Alias
,后者是PowerShell cmdlet。而Write
实际上该字符串被搜索,而不是别名Write-Output
,我还以为是因为颜色的格式化表示PowerShell命令的开始。我以为Write-Output
可以代替findstr进行搜索。不是。因此,实际上发生的是,将的每行都通过Get-Alias
管道传递到findstr,这将在管道的str中搜索搜索词“写”的不区分大小写的匹配项。
您的问题是别名发出一个AliasInfo对象流,而不是字符串流。这就是我想您想要的。
alias | out-string -stream | select-string Alias
或作为功能
function grep {
$input | out-string -stream | select-string $args
}
alias | grep Alias
当您不处理管道中的内容时(例如您只是运行“ alias”时),shell会知道在每个对象上使用ToString()方法(或使用ETS信息中指定的输出格式)。
如果您真的想“格式化”格式化的输出(显示字符串),则可以使用Mike的方法。肯定在某些时候这很方便。但是,如果您想尝试拥抱PowerShell的对象管道性质,请尝试执行此操作。首先,检查流经管道的对象的属性:
PS> alias | Get-Member
TypeName: System.Management.Automation.AliasInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
<snip>
*Definition* Property System.String Definition {get;}
<snip>
注意Definition属性,它是显示Get-Alias(别名)输出时看到的标题,例如:
PS> alias
CommandType Name *Definition*
----------- ---- ----------
Alias % ForEach-Object
<snip>
通常标题标题与属性名称匹配,但并不总是匹配。那就是使用Get-Member派上用场的地方。它显示了您需要针对“脚本”进行操作的内容。现在,如果要“ grep”显示的是Definition属性的内容,请考虑一下。您不仅可以复制一个属性的值,还可以通过该属性的内容过滤管道中的每个AliasInfo对象,并且可以使用正则表达式来做到这一点,例如:
PS> alias | Where-Object {$_.Definition -match 'alias'}
CommandType Name Definition
----------- ---- ----------
Alias epal Export-Alias
Alias gal Get-Alias
Alias ipal Import-Alias
Alias nal New-Alias
Alias sal Set-Alias
在此示例中,我使用Where-Object cmdlet根据任意脚本过滤对象。在这种情况下,我通过与正则表达式“别名”匹配的Defintion属性进行过滤。只有那些针对该过滤器返回true的对象才被允许沿管道传播并被格式化以显示在主机上。
顺便说一句,如果您键入此内容,则可以为Where-Object使用两个别名之一-'Where'或'?'。例如:
PS> gal | ?{$_.Definition -match '-Item*'}
findstr
PowerShell将为您处理文本转换的位置,因为它不是cmdlet而是程序(出于完整性考虑;通常最好根据属性进行过滤,恕我直言:
gal | Where Definition -match 'alias'
有两个问题。如问题所示,选择字符串需要对输出字符串进行操作,可以从“输出字符串”中进行选择。另外,select-string不能对通过管道传递给它的字符串进行逐行操作。这是一个通用的解决方案
(alias|out-string) -split "`n" | select-string Write
Get-Member
,然后在where
命令中使用正确的属性和表达式。并且grep
在这一方面特别好。
-Stream
on上使用参数Out-String
,然后就可以直接通过管道传递给Select-String。
对于更灵活和惰性的解决方案,可以匹配对象的所有属性。在大多数情况下,这应该可以让您获得所需的行为,而在没有行为时,您总是可以更加具体。这是一个基于此原理的grep函数:
Function Select-ObjectPropertyValues {
param(
[Parameter(Mandatory=$true,Position=0)]
[String]
$Pattern,
[Parameter(ValueFromPipeline)]
$input)
$input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output
}