2011-08-23 14 views
6

vi esta declaración Powershell en una reciente Hanselminutes post -

cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x} | sort | get-unique 

Estoy tratando de aprender Powershell en el momento y creo que entiendo más de lo que está pasando -

  • la declaración recorre cada línea de 'test.txt' y se ejecuta una expresión regular en contra de la línea actual
  • Todos los resultados se recogen y clasifican y se eliminan los duplicados

Mi entendimiento parece caer abajo en esta parte de la declaración -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x 
  • Cuál es la '$null =' parte del código haciendo, sospecho que esto es para manejar un escenario cuando hay coincidencia se devuelve pero no estoy seguro de cómo funciona ?
  • ¿Está '$matches.x' devolviendo las coincidencias encontradas?

Respuesta

8

Sí, el operador -match da como resultado True o False; la asignación a $null suprime la salida.

La sintaxis regex (?<>) crea un grupo de captura. En este caso, está creando un grupo de captura llamado x para cualquier carácter entre <FancyPants> y <.FancyPants>. $matches contiene la información del partido del último partido. Los grupos de captura pueden ser referenciados por $matches.CaptureGroupName.

Aquí hay un ejemplo que puede usar para ver lo que está en la variable $Matches.

'123 Main','456 Broadway'| foreach{$_; $null = $_ -match '(?<MyMatch>\d+)'; ($Matches| ft *)} 

En este ejemplo usaría $Matches.MyMatch para hacer referencia a la coincidencia.

+0

Entonces '$ matches.x' contiene las coincidencias para el objeto actual, ¿PS clasifica automáticamente todos los conjuntos de resultados' $ matches' en un gran conjunto de resultados? – ipr101

+0

@ ipr101 No, solo guarda la última coincidencia. He actualizado mi respuesta con un ejemplo que puede usar para ver lo que está en la variable '$ Matches'. – Rynant

+0

gracias que tiene más sentido ahora – ipr101

5

'$ null = ...' se utiliza para suprimir el resultado de la comparación. Es posible que haya visto algo similar, como:

command | Out-Null 

En lo anterior, el cmdlet Out-Null se utiliza para suprimir la salida. En algunos casos, puede ver esto también:

[void] (...) 

Básicamente, todos los ejemplos hacen lo mismo, ignorando la salida. Si no utiliza uno de los anteriores, el resultado va a volver a escribirse en la canalización y puede obtener resultados inesperados de comandos que se encuentran más adelante en la tubería.

+1

Ver también http://stackoverflow.com/questions/5260125/whats-the-better-cleaner-way-to-ignore-output-in-powershell –

+0

Gracias. Recuerdo una publicación del equipo de PowerShell (de James Brundage?) Sobre esto, pero no puedo encontrarlo. –