试图绕开为什么这是一种方法的想法,而不能是另一种方法。我已经进行了一些搜索,并在此处提供了答案:
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,函数,脚本文件或可运行程序的名称。
拖放回工作版本不会返回此错误。任何反馈表示赞赏。我可以继续使用工作版本,但我想了解为什么它可以确保我自学时不会犯错误。