我如何能够确定脚本的两点之间定义了哪些函数?
例如
function dontCare()
{}
# Start here
function A()
{}
function B()
{}
# Know that A and B have been defined
我正在考虑Get_ChildItem function:*
在这两点上使用和获取差异,但是如果已经定义了函数,那将不起作用。
我如何能够确定脚本的两点之间定义了哪些函数?
例如
function dontCare()
{}
# Start here
function A()
{}
function B()
{}
# Know that A and B have been defined
我正在考虑Get_ChildItem function:*
在这两点上使用和获取差异,但是如果已经定义了函数,那将不起作用。
不确定这将如何工作:如果您在脚本中定义函数,您应该知道您定义了它们。你在点源其他脚本吗?
如果不是,那么这应该可以让您到达那里(即使在脚本运行之前定义了 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
对我来说,只有点源场景才有意义(你使用外部源,所以不能确定它定义了什么),但我认为你可能需要两者......;)
您可以解析脚本,列出所有函数并根据结果进行逻辑处理。
$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
你可以这样做:
$exists = get-command -erroraction silentlycontinue A
然后,您可以根据结果分支您的逻辑。