代码在function()包装器之外工作,但不在内部工作吗?

时间:2019-06-17 16:22:23

标签: powershell

试图绕开为什么这是一种方法的想法,而不能是另一种方法。我已经进行了一些搜索,并在此处提供了答案:

How to call function outside a scriptblock

似乎与我认为的经验非常接近,但是我无法理解为什么一个版本可以正常工作,而另一个版本却不能正常工作。我试图在下面的示例中充分简化代码,而又不会失去其实质所在。

高级摘要

我正在运行一个脚本(脚本A),该脚本在单独的文件夹中包含一堆模块。运行脚本A时,它将调用基于$ moduleName的脚本B,该脚本将调用该模块的主函数(始终为$ moduleName)。

这有效:

脚本A

. "$PSScriptRoot/scriptB.ps1"

#getModules - pulls in a dynamic list of modules
$modules = Get-ChildItem ./modules/* -Include *.ps1 | Select-Object Name
foreach ($module in $modules) {
    $moduleName = $module.Name
    . "$PSScriptRoot/modules/$moduleName"
}

runScript

脚本B

function runScript {
    try { 
        $sb = (Get-Command $moduleName -CommandType Function -ErrorAction Stop).ScriptBlock
        Invoke-Command -ScriptBlock $sb -ErrorAction Stop
    } catch {
        Write-Host "Something didn't work"
    }
}

这不是:

脚本A-v2

. "$PSScriptRoot/scriptB.ps1"

#getModules - pulls in a dynamic list of modules
function getModules {
    $modules = Get-ChildItem ./modules/* -Include *.ps1 | Select-Object Name
    foreach ($module in $modules) {
        $moduleName = $module.Name
        . "$PSScriptRoot/modules/$moduleName"
    }
}
getModules
runScript

它引发类似于以下内容的错误:

  

:无法将术语“ moduleName.ps1”识别为cmdlet,函数,脚本文件或可运行程序的名称。

拖放回工作版本不会返回此错误。任何反馈表示赞赏。我可以继续使用工作版本,但我想了解为什么它可以确保我自学时不会犯错误。

0 个答案:

没有答案