我如何确定脚本两点之间定义的函数?
e.g。
function dontCare()
{}
# Start here
function A()
{}
function B()
{}
# Know that A and B have been defined
我正在考虑使用Get_ChildItem function:*
并在两点上取得差异,但如果已经定义了这些功能,这将无效。
答案 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
然后,您可以根据结果分支逻辑。