PowerShell и Regex разочарование - PullRequest
       3

PowerShell и Regex разочарование

0 голосов
/ 23 февраля 2011

Хорошо, у меня есть файл functions.ps1, который содержит только код функции: что-то вроде этого:

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

Теперь последняя функция в этом файле (и та, которая имеет отношение к моей проблеме):

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

Идея заключается в том, что из консоли я могу указать исходный файл function.ps1, и, запустив List-Functions, я получу список всех функций в файле функций.

За исключением запуска, List-Function возвращает что-то вроде этого:

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

Все круто, кроме последнего фрагмента кода. Я знаю, что это только соответствует шаблону, который я дал, но это раздражает меня чем-то яростным.

Я знаю, что мое регулярное выражение слабо, и я пытался изменить функции списка, чтобы отфильтровать этот бит, но у меня нет радости. Кто-нибудь может указать, что я могу сделать, чтобы это работало правильно?

Мое решение (которое некрасиво) состояло в том, чтобы изменить List-Functions на это:

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

Я же говорил, это было некрасиво, но это работает;)

1 Ответ

3 голосов
/ 23 февраля 2011

Вам нужно сопоставлять только те строки, которые начинаются со строки ##.Поэтому измените свое регулярное выражение на

$func_1 = "^##  FUNCTION"

Лучшее решение : рассмотрите возможность использования модулей.Сохраните ваши функции Some-Function1 и Some-Function2 в файле MyModule.psm1.Тогда:

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

Как вы можете попробовать регулярное выражение:

@'
##--------------------------------------------------------------------------
##  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...