J'essaie d'extraire les en-têtes de commentaire Get-Help d'un script PowerShell ... à l'aide de PowerShell. Le fichier que je lis ressemble à ceci:
$script = Get-Content -Path "C:\path\to\the\script.ps1" -Raw $pattern = '\.DESCRIPTION(.*?)\.PARAMETER' $description = $script | Select-String -Pattern $pattern Write-Host $description
Je voudrais obtenir tout le texte ci-dessous .DESCRIPTION , jusqu'à la première instance de .PARAMÈTRE . Le résultat souhaité serait donc:
A description. It could also span multiple lines.
Voici ce que j'ai essayé:
<#
.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...
Quand je l'exécute, $ description est vide. Si je change $ pattern en . * , j'obtiens tout le contenu du fichier, comme prévu; Il doit donc y avoir un problème avec mon modèle RegEx, mais je n'arrive pas à le comprendre.
Des idées?
3 Réponses :
la cmdlet Select-String fonctionne sur chaînes entières et vous lui avez donné UNE chaîne. [ grin ]
donc, au lieu de me battre avec ça, j'ai choisi l'opérateur -match . ce qui suit suppose que vous avez chargé le fichier entier dans $ InStuff comme une chaîne multiligne avec -Raw .
le truc (? ms) est composé de deux drapeaux d'expression régulière - multiligne et simple.
DESCRIPTION
A description.
It could also span multiple lines.
sortie ...
$InStuff -match '(?ms)(DESCRIPTION.*?)\.PARAMETER' $Matches.1
notez qu'il y a une ligne vide à la fin. vous voudrez probablement l'éliminer.
Ne tenez pas compte de mon dernier commentaire, cela a fonctionné, je l'ai en quelque sorte pointé sur un script qui n'avait pas d'en-tête DESCRIPTION lorsque j'ai testé cette solution. Je vous remercie pour votre aide! P.S. Quand vous avez dit que fonctionne sur des chaînes entières et que vous lui avez donné UNE chaîne , voulez-vous dire que cela fonctionne sur une collection de chaînes et que je ne lui ai donné qu'une chaîne? Je m'assure juste de comprendre ce que tu voulais dire
@LewsTherin - vous êtes les bienvenus! [ grin ] ///// lorsque vous utilisez Get-Content -Raw , vous obtenez UNE chaîne multiligne. essayez de faire un .GetType () dessus. lorsque vous utilisez Get-Content sans le paramètre -Raw , vous obtenez un tableau de chaînes sur une seule ligne. la façon dont Select-String fonctionne est de sélectionner des chaînes entières ... et si vous lui donnez UNE chaîne ... alors il trouvera -au plus - UNE chaîne. [ sourire ]
Pour reprendre les termes de @Mathias R. Jessen :
N'utilisez pas de regex pour analyser le code PowerShell dans PowerShell
Utilisez plutôt l'analyseur PowerShell!
Alors, 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 sortir un arbre de syntaxe abstraite (AST).
Une fois que nous avons l'arbre de syntaxe abstraite, nous pouvons alors utiliser le code GetHelpContent () > méthode (exactement ce que Get-Help utilise) pour obtenir notre contenu d'aide analysé.
Puisque nous ne sommes intéressés que par la partie Description , nous pouvons il suffit d'y accéder directement avec .GetHelpContent().Description
oooo! c'est tellement chouette! [ sourire ]
@Lee_Dailey Je pensais que tu aimerais ça ;-)
Je joue avec les trucs AST en ce moment. j'avais complètement oublié qu'il y avait une telle chose ... [ sourire ]
Je ne savais pas que tu pouvais faire ça, cool! Je vais essayer cette approche, merci!
(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
J'essaye de l'extraire d'un script que j'ai écrit, ce n'est pas un module installé. Mais truc cool!
(get-help. \ script.ps1) .description
Oh wow, je viens de tester ça et ça a marché. Encore plus simple, merci!