确定脚本中两点之间定义的函数

时间:2013-01-05 03:35:12

标签: powershell

我如何确定脚本两点之间定义的函数?

e.g。

function dontCare()
{}
# Start here
function A()
{}

function B()
{}
# Know that A and B have been defined

我正在考虑使用Get_ChildItem function:*并在两点上取得差异,但如果已经定义了这些功能,这将无效。

3 个答案:

答案 0 :(得分:1)

您可以解析脚本,列出所有函数并对结果进行逻辑判断。

$content = Get-Content .\script.ps1
$tokens = [System.Management.Automation.PSParser]::Tokenize($content,[ref]$null)

for($i=0; $i -lt $tokens.Count; $i++)
{
    if($tokens[$i].Content -eq 'function')
    {
        $tokens[$i+1]
    }
}

在v中,您也可以使用AST,参见Ravi的ISE函数资源管理器插件: http://www.ravichaganti.com/blog/?p=2518

答案 1 :(得分:1)

不确定这是如何工作的:如果你在脚本中定义函数,你应该知道你定义它们。你是否正在寻找其他剧本?

如果没有,那么这应该会让你到那里(即使在脚本运行之前定义了A和B):

# NewScript.ps1
function dontCare()
{}
# Start here
$Me = (Resolve-Path -Path $MyInvocation.MyCommand.Path).ProviderPath

$defined = ls function: | 
    where { $_.ScriptBlock.File -eq $Me } |
    foreach { $_.Name }

function A()
{}

function B()
{}
# Know that A and B have been defined
ls function: |
    where { 
        $_.ScriptBlock.File -eq $Me -and
        $defined -notcontains $_.Name
    } |
    foreach { $_.Name }
# end of script body, trying it...

.\NewScript.ps1
A
B

如果您正在点击脚本,它会变得更加容易:

# NewScript2.ps1
function dontCare2()
{}
# Start here
$He = (Resolve-Path -Path .\NewScript.ps1).ProviderPath

. $He | Out-Null

ls function: |
    where { 
        $_.ScriptBlock.File -eq $He
    } |
    foreach { $_.Name }
# end of script body, trying it...

.\NewScript2.ps1
A
B
dontCare

对我来说,只有点源方案才有意义(你使用外部来源所以不能确定它定义了什么)但我认为你可能需要两者......;)

答案 2 :(得分:0)

你可以这样做:

$exists = get-command -erroraction silentlycontinue A

然后,您可以根据结果分支逻辑。