似乎无法使RegEx匹配

时间:2019-07-18 21:09:46

标签: regex powershell

我正在尝试使用PowerShell从PowerShell脚本中提取Get-Help注释标头。我正在读取的文件看起来像这样:

<#
    .SYNOPSIS
        Synopsis goes here.
        It could span multiple lines.
        Like this.

    .DESCRIPTION 
        A description.
        It could also span multiple lines.

    .PARAMETER MyParam
        Purpose of MyParam

    .PARAMETER MySecondParam
        Purpose of MySecondParam.
        Notice that this section also starts with '.PARAMETER'.
        This one should not be captured.

    ...and many many more lines like this...
#>

# Rest of the script...

我想获得.DESCRIPTION下的所有文本,直到.PARAMETER的第一个实例为止。因此,所需的输出将是:

A description.
It could also span multiple lines.

这是我尝试过的:

$script = Get-Content -Path "C:\path\to\the\script.ps1" -Raw
$pattern = '\.DESCRIPTION(.*?)\.PARAMETER'

$description = $script | Select-String -Pattern $pattern

Write-Host $description

运行该命令时,$description为空。如果将$pattern更改为.*,则会按预期获得文件的全部内容;因此,我的RegEx模式肯定有问题,但是我似乎无法弄清楚。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

Select-String cmdlet适用于整个字符串,并且您已经给了它一个字符串。 [咧嘴]

因此,我没有与之抗争,而是与-match运算符一起使用。以下假设您已使用$InStuff将整个文件作为一个多行字符串加载到-Raw中。

(?ms)的东西是两个正则表达式标志-多行和单行。

$InStuff -match '(?ms)(DESCRIPTION.*?)\.PARAMETER'

$Matches.1

输出...

DESCRIPTION 
        A description.
        It could also span multiple lines.

请注意,末尾有一个空白行。您可能会想要修剪掉它。

答案 1 :(得分:4)

(get-help get-date).description

The `Get-Date` cmdlet gets a DateTime object that represents the current date 
or a date that you specify. It can format the date and time in several Windows 
and UNIX formats. You can use `Get-Date` to generate a date or time character 
string, and then send the string to other cmdlets or programs.

(get-help .\script.ps1).description 

答案 2 :(得分:3)

@Mathias R. Jessen的话:

  

不要使用正则表达式在PowerShell中解析PowerShell代码

     

改为使用PowerShell解析器!

因此,让我们使用PowerShell来解析PowerShell:

$ScriptFile = "C:\path\to\the\script.ps1"

$SriptAST = [System.Management.Automation.Language.Parser]::ParseFile($ScriptFile, [ref]$null, [ref]$null)

$ScriptAST.GetHelpContent().Description

我们使用[System.Management.Automation.Language.Parser]::ParseFile()解析文件并输出抽象语法树(AST)。

一旦有了抽象语法树,我们就可以使用GetHelpContent()方法(正是Get-Help所使用的方法)来获取已解析的帮助内容。

由于我们仅对Description部分感兴趣,因此我们可以直接通过.GetHelpContent().Description直接访问它