content powershell

content - PowerShell: cómo grep salida de comando?



select-string (6)

En PowerShell lo he intentado:

alias | select-string Alias

Esto falla a pesar de que Alias está claramente en la salida. Sé que esto se debe a que select-string está operando en algún objeto y no en la cadena de salida real.

¿Qué se puede hacer al respecto?


Creo que esta solución es más fácil y mejor, use directamente la función findstr:

alias | findstr -i Write

También puede hacer un alias para usar la palabra grep:

new-alias grep findstr


Hay dos problemas Como en la pregunta, select-string necesita operar en la cadena de salida, que se puede obtener desde "out-string". Además, select-string no funciona linewise en las cadenas que están conectadas a él. Aquí hay una solución genérica

(alias|out-string) -split "`n" | select-string Write


La solución propuesta es mucho trabajo para algo que se puede hacer así:

Get-Alias -Definition Write*


Para una solución más flexible y perezosa, puede hacer coincidir todas las propiedades de los objetos. La mayoría de las veces, esto debería obtener el comportamiento que desea, y siempre puede ser más específico cuando no lo hace. Aquí hay una función grep que funciona según este principio:

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 }


Si realmente quiere "grep" la salida formateada (cadenas de visualización), entonces vaya con el enfoque de Mike. Definitivamente hay momentos en que esto es útil. Sin embargo, si quiere intentar abarcar la naturaleza de la tubería de objetos de PowerShell, intente esto. Primero, revisa las propiedades de los objetos que fluyen por la tubería:

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>

Tenga en cuenta la propiedad Definition, que es un encabezado que se ve cuando se muestra el resultado de Get-Alias ​​(alias), por ejemplo:

PS> alias CommandType Name *Definition* ----------- ---- ---------- Alias % ForEach-Object <snip>

Por lo general, el título del encabezado coincide con el nombre de la propiedad, pero no siempre. Ahí es donde usar Get-Member es útil. Le muestra lo que necesita para "guiar" en contra. Ahora, si lo que desea "grep" es el contenido de la propiedad Definition, considere esto. En lugar de limitar el valor de una propiedad, en su lugar puede filtrar cada objeto AliasInfo en la tubería por el contenido de esta propiedad y puede usar una expresión regular para hacerlo, por ejemplo:

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

En este ejemplo, uso el cmdlet Where-Object para filtrar objetos en función de algún script arbitrario. En este caso, filtre por la propiedad Defintion que coincida con el ''alias'' de expresiones regulares. Solo aquellos objetos que devuelven verdadero para ese filtro pueden propagarse por la canalización y formatearse para mostrarse en el host.

Por cierto, si está escribiendo esto, puede usar uno de dos alias para Where-Object - ''Where'' o ''?''. Por ejemplo:

PS> gal | ?{$_.Definition -match ''-Item*''}


Su problema es que alias emite una secuencia de objetos AliasInfo, en lugar de una secuencia de cadenas. Esto hace lo que creo que quieres.

alias | out-string -stream | select-string Alias

o como una función

function grep { $input | out-string -stream | select-string $args } alias | grep Alias

Cuando no maneja cosas que están en proceso (como cuando acaba de ejecutar ''alias''), el shell sabe usar el método ToString () en cada objeto (o usa los formatos de salida especificados en la información ETS).