2 votes

Je n'arrive pas à faire correspondre le RegEx.

J'essaie d'extraire le Get-Help les en-têtes de commentaire d'un script PowerShell... en utilisant PowerShell. Le fichier que je lis ressemble à quelque chose comme ceci :

<#
    .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...

Je voudrais obtenir tout le texte ci-dessous .DESCRIPTION jusqu'à la première instance de .PARAMETER . Donc la sortie souhaitée serait :

A description.
It could also span multiple lines.

Voici ce que j'ai essayé :

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

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

Write-Host $description

Quand j'exécute ça, $description est vide. Si je change $pattern a .* J'obtiens le contenu complet du fichier, comme prévu. Il doit donc y avoir un problème avec mon modèle RegEx, mais je ne parviens pas à le résoudre.

Des idées ?

5voto

js2010 Points 823
(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

4voto

Lee_Dailey Points 6329

Le site Select-String La cmdlet fonctionne sur cordes entières et vous lui avez donné UNE chaîne. [ grin ]

donc, au lieu de me battre avec ça, j'ai opté pour les -match Le texte suivant suppose que vous avez chargé l'intégralité du fichier dans l'ordinateur de l'opérateur. $InStuff comme une chaîne multi-ligne avec -Raw .

le site (?ms) stuff a deux drapeaux regex - multiline & singleline.

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

$Matches.1

sortie ...

DESCRIPTION 
        A description.
        It could also span multiple lines.

Notez qu'il y a une ligne vide à la fin. Vous voudrez probablement la couper.

3voto

HAL9256 Points 5826

Selon les termes de @Mathias R. Jessen :

Ne pas utiliser de regex pour analyser le code PowerShell dans PowerShell

Utilisez l'analyseur PowerShell à la place !

Donc, utilisons PowerShell pour analyser PowerShell :

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

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

$ScriptAST.GetHelpContent().Description

Nous utilisons le [System.Management.Automation.Language.Parser]::ParseFile() pour analyser notre fichier et produire un arbre syntaxique abstrait (AST).

Une fois que nous disposons de l'arbre syntaxique abstrait, nous pouvons alors utiliser la fonction GetHelpContent() (exactement ce que Get-Help utilise) pour obtenir le contenu de l'aide analysé.

Puisque nous ne sommes intéressés que par le Description nous pouvons simplement y accéder directement avec .GetHelpContent().Description

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X