PowerShell和正则表达式的挫败感

时间:2011-02-23 02:09:48

标签: powershell

好的,所以我有一个名为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来过滤掉那个位,但我没有快乐。任何人都可以指出我能做些什么才能让它正常工作?

我的解决方案(很难看)是将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 个答案:

答案 0 :(得分:3)

您只需要匹配以字符串##开头的行。所以将你的正则表达式改为

$func_1 = "^##  FUNCTION"

更好的解决方案:考虑使用模块。将您的函数Some-Function1Some-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