我正在尝试使用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模式肯定有问题,但是我似乎无法弄清楚。
有什么想法吗?
答案 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)
不要使用正则表达式在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
直接访问它