2011-02-23 4 views
0

Ok, donc j'ai un fichier appelé functions.ps1 qui ne contient que le code de fonction: quelque chose comme ceci:PowerShell et Regex frustration

##-------------------------------------------------------------------------- 
## FUNCTION.......: some-Function1 
## PURPOSE........: 
## EXAMPLE........: 
## REQUIREMENTS...: PowerShell 2.0 
## NOTES..........: 
##-------------------------------------------------------------------------- 
Function Some-Function1 
{ 
Code goes here 
} 
##-------------------------------------------------------------------------- 
## FUNCTION.......: some-Function2 
## PURPOSE........: 
## EXAMPLE........: 
## REQUIREMENTS...: PowerShell 2.0 
## NOTES..........: 
##-------------------------------------------------------------------------- 
Function Some-Function2 
{ 
Code goes here 
} 

Maintenant, la dernière fonction dans ce fichier (et celui correspondant à mon question) est la suivante:

##-------------------------------------------------------------------------- 
## FUNCTION.......: List-Functions 
## PURPOSE........: 
## EXAMPLE........: 
## REQUIREMENTS...: PowerShell 2.0 
## NOTES..........: 
##-------------------------------------------------------------------------- 
function List-Functions 
{ 
    $func_1 = "## FUNCTION" 
    $func_2 = Get-Content \\Server\scripts\functions.ps1 
    $func_2 | select-string -pattern $func_1 | foreach {write-host $_.line} 
} 

l'idée est ici que de la console je peux dot localiser le fichier function.ps1 et en tirant hors liste-fonctions, je vais obtenir une liste de toutes les fonctions du fichier de fonctions.

Sauf lorsqu'il est exécuté, Liste-fonction retourne quelque chose comme ceci:

## FUNCTION.......: some-Function1 
## FUNCTION.......: some-Function2 
## FUNCTION.......: List-Functions 
$func_1 = "## FUNCTION" 

Tout est cool, sauf que le dernier morceau de code. Je sais que ça ne fait que correspondre au modèle que je lui ai donné, mais ça m'ennuie quelque chose de furieux.

Je sais que mon Regex-fu est faible, et j'ai essayé de modifier les fonctions de liste pour filtrer ce bit, mais je n'ai pas de joie. Quelqu'un peut-il indiquer ce que je peux faire pour que cela fonctionne correctement?

Ma solution (ce qui est laid), était de changer de liste des fonctions à ceci:

##-------------------------------------------------------------------------- 
## FUNCTION.......: List-Functions 
## PURPOSE........: 
## EXAMPLE........: 
## REQUIREMENTS...: PowerShell 2.0 
## NOTES..........: 
##-------------------------------------------------------------------------- 
function List-Functions 
{ 
    $char = [char] '#' 
    $func_1 = $char + $char + " FUNCTION" 
    $func_2 = Get-Content \\server\scripts\functions.ps1 
    $func_2 | select-string -pattern $func_1 | foreach {write-host $_.line} 
} 

Je vous ai dit qu'il était laid, mais ça marche;)

Répondre

3

Vous devez faire correspondre uniquement les lignes qui commence par la chaîne ##. Donc changer votre regex à

$func_1 = "^## FUNCTION" 

Une meilleure solution: Envisagez d'utiliser des modules. Stockez vos fonctions Some-Function1 et Some-Function2 dans le fichier MyModule.psm1. Puis:

PS> Import-Module d:\MyModule.psm1 
# or with -DisableNameChecking to suppres warning messages 
PS> Import-Module d:\MyModule.psm1 -DisableNameChecking 

PS> Get-Command -module MyModule | Select -expand Name 
Some-Function1 
Some-Function2 

Comment vous pouvez essayer le regex:

@' 
##-------------------------------------------------------------------------- 
## FUNCTION.......: some-Function1 
##-------------------------------------------------------------------------- 
Function Some-Function1 
{ 
Code goes here 
} 
##-------------------------------------------------------------------------- 
## FUNCTION.......: some-Function2 
##-------------------------------------------------------------------------- 
Function Some-Function2 
{ 
Code goes here 
} 
##-------------------------------------------------------------------------- 
## FUNCTION.......: List-Functions 
##-------------------------------------------------------------------------- 
function List-Functions 
{ 
    Get-Content d:\temp\sotest.ps1 | 
     select-string -pattern "^## FUNCTION" | 
     Select -exp Line 
} 
'@ | Set-Content d:\temp\sotest.ps1 
. d:\temp\sotest.ps1 
List-Functions 
+0

Et vous pouvez filtrer les commandes par sortie 'Get-commande' via le type paramètre' CommandType' (alias ' ') par exemple 'gcm -m MyModule -type fonction'. –

+0

@stej C'est d'abord ce que j'ai essayé, ça ne marche pas. Je pensais que c'était juste moi, bon de savoir que je peux au moins utiliser un personnage d'ancrage dans POSH regex correctement! – JoeG

+0

Quand je le lance avec le carat, il ne récupère rien à la console. Il y a quelque chose que POSH n'aime pas dans cette syntaxe regex ... – JoeG

Questions connexes