Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'$null =' in powershell

Tags:

powershell

I saw this Powershell statement in a recent Hanselminutes post -

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

I'm trying to learn Powershell at the moment and I think that I understand most of what is going on -

  • The statement loops through each line of 'test.txt' and runs a regex against the current line
  • All the results are collated and then sorted and duplicates removed

My understanding seems to fall down on this part of the statement -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x
  • What is the '$null = ' part of the code doing, I suspect this is to handle a scenario when no match is returned but I'm not sure how it works?
  • Is '$matches.x' returning the matches found?
like image 684
ipr101 Avatar asked Aug 23 '11 12:08

ipr101


People also ask

WHAT IS NULL value in PowerShell?

PowerShell $null is used as an empty placeholder to assign it to a variable, use it in comparisons. PowerShell $null is an object with null or absent value. NULL is used to represent empty or undefined. Variable hold null until you assign any value to it.

What does out-null mean in PowerShell?

The Out-Null cmdlet sends its output to NULL, in effect, removing it from the pipeline and preventing the output to be displayed at the screen.

Is null or empty in PowerShell?

String to check if a string variable is null or empty in PowerShell. The IsNullorEmpty() method indicates whether the specified string is empty or null. It returns True if the string is empty and False if it is not empty. Now, let's assign a string value to a variable.


2 Answers

Yes, the -match operator results in True or False; assigning to $null suppresses the output.

The (?<>) regex syntax creates a capture group. In this case it's creating a capture group called x for any characters between <FancyPants> and <.FancyPants>. $matches contains the match info for the last match. Capture groups can be referenced by $matches.CaptureGroupName.

Here is an example you can use to see what is in the $Matches variable.

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

In this example you would use $Matches.MyMatch to reference the match.

like image 155
Rynant Avatar answered Sep 29 '22 16:09

Rynant


'$null=...' is used to suppress the result of the comparison. You may have seen something similar, like:

command | Out-Null

In the above, the Out-Null cmdlet is used to suppress the output. In some cases you may see this as well:

[void] (...)

Basically, all examples do the same thing, ignoring the output. If you don't use one of the above the result is going to write back to the pipeline and you may get unexpected results from commands further down in the pipeline.

like image 35
Shay Levy Avatar answered Sep 29 '22 15:09

Shay Levy