好的,所以我有一个名为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}
}
我告诉过你它很难看,但它有效;)
答案 0 :(得分:3)
您只需要匹配以字符串##
开头的行。所以将你的正则表达式改为
$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