2011-08-23 10 views
6

Ho visto questa dichiarazione PowerShell in un recente Hanselminutes post -

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

Sto cercando di imparare PowerShell in questo momento e penso che ho capito la maggior parte di ciò che sta accadendo -

  • la dichiarazione scorre ogni riga di 'test.txt' e gestisce un regex contro la linea corrente
  • Tutti i risultati vengono raccolti e quindi disposti ed i duplicati rimossi

mia comprensione sembra cadere giù su questa parte della dichiarazione -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x 
  • Qual è il '$null =' parte del codice facendo, ho il sospetto che questo è per gestire uno scenario in cui non può competere viene restituito ma non sono sicuro di come funziona ?
  • E '$matches.x' restituire le corrispondenze trovate?

risposta

8

Sì, l'operatore -match risulta in True o False; l'assegnazione a $null elimina l'output.

La sintassi di espressione regolare (?<>) crea un gruppo di acquisizione. In questo caso sta creando un gruppo di cattura chiamato x per qualsiasi carattere compreso tra <FancyPants> e <.FancyPants>. $matches contiene le informazioni sulla partita per l'ultima partita. I gruppi di cattura possono essere referenziati da $matches.CaptureGroupName.

Ecco un esempio che è possibile utilizzare per vedere cosa c'è nella variabile $Matches.

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

In questo esempio si utilizzerà $Matches.MyMatch per fare riferimento alla corrispondenza.

+0

Quindi '$ matches.x' contiene le corrispondenze per l'oggetto corrente, PS colloca automaticamente tutti i set di risultati' $ matches' in un set di risultati di grandi dimensioni? – ipr101

+0

@ ipr101 No, mantiene solo l'ultima partita. Ho aggiornato la mia risposta con un esempio che è possibile utilizzare per vedere cosa c'è nella variabile '$ Matches'. – Rynant

+0

grazie che ha più senso ora – ipr101

5

'$ null = ...' viene utilizzato per sopprimere il risultato del confronto. Potreste aver visto qualcosa di simile, come:

command | Out-Null 

In quanto sopra, il cmdlet Out-Null è usato per eliminare l'output. In alcuni casi si può vedere anche questo:

[void] (...) 

In sostanza, tutti gli esempi fanno la stessa cosa, ignorando l'uscita. Se non si utilizza uno dei precedenti, il risultato tornerà alla pipeline e si potrebbero ottenere risultati imprevisti dai comandi più avanti nella pipeline.

+1

Vedere anche http://stackoverflow.com/questions/5260125/whats-the-better-cleaner-way-to-ignore-output-in-powerhell –

+0

Grazie. Ricordo un post del team PowerShell (di James Brundage?) Su questo, ma non riesco a trovarlo. –