Пытаюсь обернуть голову, почему это работает в одну сторону, а не в другую. Я уже провел некоторые поиски, и ответ представлен здесь:
Как вызвать функцию вне блока скриптов
Кажется, довольно близко к тому, что я испытываю, но я не могу понять, почему одна версия работает нормально, а другая - нет. Я попытался достаточно упростить код в моем примере ниже, не теряя смысла того, что это такое.
Краткий обзор высокого уровня
Я запускаю скрипт (Script A), который включает несколько модулей в отдельной папке. При запуске сценария A он вызывает сценарий B, который на основе $ moduleName вызовет основную функцию этих модулей (которая всегда равна $ 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' не распознается как имя командлета, функции, файла сценария или работоспособной программы.
Возвращение к рабочей версии не возвращает эту ошибку. Любые отзывы приветствуются. Я могу просто продолжать работать с рабочей версией, но я хотел бы понять, почему она работает, чтобы убедиться, что я не делаю ошибок, поскольку я самообучаюсь.