在PowerShell中'$ null ='

ipr*_*101 7 powershell

我在最近的Hanselminutes帖子中看到了这个Powershell声明-

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

我现在正在努力学习Powershell,我认为我理解的大部分内容是 -

  • 该语句循环遍历'test.txt'的每一行并对当前行运行正则表达式
  • 对所有结果进行整理,然后进行排序并删除重复项

我的理解似乎落在了声明的这一部分 -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x
Run Code Online (Sandbox Code Playgroud)
  • 什么是$null =代码的' '部分,我怀疑这是为了处理没有返回匹配但但我不确定它是如何工作的情况?
  • 是' $matches.x'返回找到的比赛?

Ryn*_*ant 8

是的,-match运营商导致TrueFalse; 分配以$null抑制输出.

(?<>)正则表达式的语法创建一个捕获组.在这种情况下,它正在创建一个捕获组x,该组称为<FancyPants>和之间的任何字符<.FancyPants>.$matches包含最后一场比赛的匹配信息.可以引用捕获组$matches.CaptureGroupName.

下面是一个示例,您可以使用它来查看$Matches变量中的内容.

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

在此示例中,您将使用$Matches.MyMatch引用匹配.


Sha*_*evy 5

'$ null = ...'用于抑制比较结果.你可能已经看过类似的东西,比如:

command | Out-Null
Run Code Online (Sandbox Code Playgroud)

在上面,Out-Null cmdlet用于抑制输出.在某些情况下,您也可以看到这一点:

[void] (...)
Run Code Online (Sandbox Code Playgroud)

基本上,所有示例都做同样的事情,忽略了输出.如果您不使用上述其中一项,则结果将写回管道,并且您可能会从管道中进一步向下的命令中获得意外结果.