2

我如何能够确定脚本的两点之间定义了哪些函数?

例如

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

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

我正在考虑Get_ChildItem function:*在这两点上使用和获取差异,但是如果已经定义了函数,那将不起作用。

4

3 回答 3

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

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

于 2013-01-06T09:15:47.573 回答
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

于 2013-01-05T10:30:26.017 回答
0

你可以这样做:

$exists = get-command -erroraction silentlycontinue A

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

于 2013-01-05T03:44:06.993 回答