2011-07-09 10 views
11

Tengo una pregunta simple pero también soy un principiante en PowerShell. Creo que tiene que ver con el hecho de que la salida de los comandos ps son objetos y no texto.Filtre la salida de un comando como si fuera texto

Lo que quiero hacer es obtener una lista de los servicios en ejecución que tienen el nombre "sql" en ellos.

Esto es lo que he intentado hasta ahora, pero todos los intentos no devuelve nada:

get-service | where {$_ -match 'sql'} 

get-service | where {$_ -like 'sql'} 

get-service | select-string sql 

Busco a un patrón que me permite tratar a la salida de cada comando de texto de búsqueda.

Respuesta

5

Las otras respuestas son correctas, por supuesto, sobre su pregunta específica de iniciar servicios que tienen "sql" en su nombre, pero para responder a la pregunta genérica:

Puede hacer get-service | out-string y obtendrá la salida como una cadena, muy parecido a cómo funcionan los comandos de Unix.

Además, cuando la salida se canaliza a comandos que no son de powershell, se convierte a texto, por lo que, por ejemplo: get-service | grep sql funcionará de la forma que usted desee.

Pero de nuevo, como dice @JPBlanc, es bueno abrazar la forma en que funciona Powershell, que es que las salidas son objetos. Te da mucho más control y mantiene las cosas simples y legibles (los comandos de Unix con sed, awk y lo que no funciona en la salida de texto de otras salidas de comando pueden volverse muy crípticas!)

+0

Hola manojlds, – buckley

+0

Esta fue la respuesta genérica que estaba buscando, así que marqué tu respuesta. Para volver a especifico, así es como creo que filtre la lista para SQL: get-service | out-string | findstr SQL También debería ser posible con select-string, creo. @mjolinor Gracias por aclaraciones. Vengo de objetos C#, así que conozco bien las ventajas de esta estructura rígida. Lo que estaba buscando aquí fue una manera rápida ("scripty"?) De obtener lo que quería en la línea de comando. Estoy de acuerdo en que si esto fuera necesario en un script de producción, deberíamos usar objetos/propiedades, ya que son más fáciles de mantener – buckley

+1

Lo que hay que observar con Out-String es que se trunca a 80 caracteres de forma predeterminada. Normalmente, bla | Out-String -Width 1kb o -Width 10kb para evitar esto. –

10

Estás manera trabajando demasiado duro en ello:

get-service *sql* 
+0

Esta respuesta es realmente incorrecta. Lo que hace es buscar a través de los parámetros .Name de los objetos, pero no a través de todos los parámetros que se muestran en el resultado de texto. Entonces "Get-service * Stopped *" no devuelve nada, mientras que "Get-Service | out-string | findstr Stopped" lo haría. Esta fue la pregunta de OP ... – Wouter

+0

Para ser claros, al buscar un servicio específico, su enfoque tiene mucho más sentido. Pero si la pregunta es "cómo buscar el resultado como si fuera texto", no tendrá los resultados deseados. No rechazaré porque es una respuesta valiosa, y podría haber sido lo que OP realmente está buscando. – Wouter

8

Tom simplemente 'Olvidarlo': o) salidas son objetos que están en lo cierto, y que se va a utilizar esto.

Así @mjolinor tiene la respuesta más corto, pero para su conocimiento sólo a prueba:

Get-service | Get-Member 

para que pueda comprender que

Get-service | Where-Object {$_.name -match ".*sql.*" } 

también funciona, y no lo que tiene su texto como una PROPIEDAD del objeto

2

Que el texto del nombre es propiedad del objeto es importante para entender y cómo usar los valores de las propiedades en un filtro.

Otro aspecto de Powershell puede aprovechar para resolver esta es la selección de propiedades de objetos con Select-Object:

get-service | select -expand name 

le conseguirá una matriz de cadenas con los nombres de los servidores, y dos de los originales tres filtros funcionarían en eso. El -like no va a funcionar porque no hay comodines en la cadena de prueba. Lo único que coincidirá es simplemente 'sql'.

Todavía creo que la primera solución que publique es la mejor. Es importante saber cómo hacer el filtrado tardío, pero también cómo usar el filtro temprano cuando sea posible.

1

Si alguien quiere más información sobre las operaciones lógicas, consulte http://technet.microsoft.com/en-us/library/ee177028.aspx

-lt - Menos de

• -le - Menor o igual a

• -gt - - Mayor que

• -ge - Mayor o igual a

• eq - Igual a

• -ne - No es igual a

• -como - Al igual; utiliza comodines para la comparación de patrones

get-service | where {$_ -match 'sql'} would be get-service | where {$_ -eq "sql"}

get-service | where {$_ -like 'sql'} would be get-service | where {$_ -like "sql"}

Y ahora un ejemplo real.

PS C:\> Get-Service | where {$_.name -like "net*"}

Status Name DisplayName
------ ---- -----------
Running Net Driver HPZ12 Net Driver HPZ12
Running Netlogon Netlogon

3
Get-service | Select-String -Pattern "sql" 

Esto funciona igual que grep. E incluso se puede ordenar

Get-service | Select-String -Pattern "sql" | sort 
+0

¿Hay alguna razón por la que esto no funcionaría en PS2? Por mi $ PSVersionTable.PSVersion. Soy como OP original, no puedo hacer que funcione, aquí probé una "simple", "evento" o "evento *" para el registro de eventos, y aunque get-service funciona, el subconjunto devuelve nil. ty! – AnneTheAgile

0

La mayoría de respuestas aquí se centran en encontrar el nombre del servicio con "SQL" en el nombre, no en todo el filtrado salida como si fuera texto. Además, la respuesta aceptada utiliza una función no powershell "findstr".

Por lo tanto, es cierto, lo que sigue no es la solución más elegante, pero para mayor abundamiento me gustaría ofrecer la solución PowerShell 100% que se lleva a la cuestión de la OP, literalmente:

(get-Service | Out-String) -split "`r`n" | Select-String sql 
  • Nosotros necesita Out-String porque el uso de las soluciones proporcionadas en otras respuestas no nos proporciona la salida de texto completo del comando Get-Service, solo el parámetro Name.
  • Tenemos que dividir en líneas nuevas, porque Select-String parece tratar el texto completo como una cadena larga, y lo devuelve como un todo, si se encuentra "sql" en él.
  • Uso Select-String en lugar de findstr, porque findstr no es una función de PowerShell.

Esta es una respuesta purista, y en la práctica, para este caso de uso específico, no lo recomendaría. Pero para las personas que vienen aquí a través de google en función del título de la pregunta, esta es una respuesta más precisa ...

0

es probable que desee esto:

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 
} 

Lo que estamos haciendo aquí va aunque cada propiedad de un objeto para ver si coincide con el patrón dado. Si el objeto contiene una o más de esas propiedades, lo escribimos. Resultado final: grep por todas las propiedades de un objeto.

Colóquelo en sus archivos de configuración y grep hasta su contenido.

Cuestiones relacionadas