在PowerShell我尝试过:
alias | select-string Alias
即使Alias
显然在输出中,这也会失败。我知道这是因为select-string在某个对象上运行而不是实际的输出字符串。
可以做些什么呢?
答案 0 :(得分:46)
我认为这个解决方案更简单,更好,直接使用函数findstr:
alias | findstr -i Write
您还可以使用别名来使用grep word:
new-alias grep findstr
答案 1 :(得分:33)
你的问题是别名会发出一个AliasInfo对象流,而不是一个 字符串流。这就是我认为你想要的。
alias | out-string -stream | select-string Alias
或作为一种功能
function grep {
$input | out-string -stream | select-string $args
}
alias | grep Alias
当你不处理管道中的东西时 (就像你刚刚运行'alias'一样),shell知道使用ToString()方法 在每个对象上(或使用ETS信息中指定的输出格式)。
答案 2 :(得分:30)
如果你真的想要“格式化”格式化输出(显示字符串),那么请选择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”是定义属性内容,那么请考虑这一点。您可以使用此属性的内容来过滤管道中的每个AliasInfo对象,而不是仅仅对该属性的值进行grepping,您可以使用正则表达式来执行此操作,例如:
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根据某些任意脚本过滤对象。在这种情况下,我使用与正则表达式“alias”匹配的Defintion属性进行过滤。只允许那些为该过滤器返回true的对象沿管道传播并进行格式化以便在主机上显示。
顺便说一句,如果你输入这个,那么你可以使用Where-Object的两个别名之一 - 'Where'或'?'。例如:
PS> gal | ?{$_.Definition -match '-Item*'}
答案 3 :(得分:13)
有两个问题。在问题中,select-string需要对输出字符串进行操作,输出字符串可以来自“out-string”。此外,select-string不会对通过管道连接的字符串进行逐行操作。这是一个通用的解决方案
(alias|out-string) -split "`n" | select-string Write
答案 4 :(得分:4)
建议的解决方案只是为了能够完成这样的工作:
Get-Alias -Definition Write*
答案 5 :(得分:0)
对于更灵活和懒惰的解决方案,您可以匹配对象的所有属性。大多数情况下,这应该可以帮助您获得所需的行为,而且当它没有时,您可以更加具体。这是一个基于这个原则工作的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
}
答案 6 :(得分:0)
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
然后在PS中匹配将导致字段与列中的某个值不匹配
答案 7 :(得分:0)
试试这个:
PS C:\> ipconfig /displaydns | Select-String -Pattern 'www.yahoo.com' -Context 0,7
> www.yahoo.com
----------------------------------------
> Record Name . . . . . : www.yahoo.com
Record Type . . . . . : 5
Time To Live . . . . : 27
Data Length . . . . . : 8
Section . . . . . . . : Answer
CNAME Record . . . . : new-fp-shed.wg1.b.yahoo.com