Как вызвать Start-Job, которая зависит от функции в том же модуле powershell, что и функция, вызывающая Start-Job?

Я пишу немного PowerShell для общения с API AWS, в одном модуле. Я написал одну функцию, Get-CloudFormation, который возвращает статус CloudFormation. Я написал другую функцию, Delete-CloudFormation, который после запуска API-запроса delete-CF пытается запустить задание, которое опрашивает состояние CloudFormation, используя мой Get-CloudFormation,

Я звоню Export-ModuleMember на Get-CloudFormation (но нет Delete-CloudFormation; это частная функция). Get-CloudFormation определяется ранее в модуле-файле, чем Delete-CloudFormation,

мой Start-Job звонок (внутри Delete-CloudFormation) похоже:

$job = Start-Job -Name "CloudFormationWaitForDeleteSuccess" -ScriptBlock {
    $status = ""
    $time = 0
    while($status -ne "DELETE_COMPLETE") {
        Write-Verbose ("Checking CloudFormation status")
        $stack = Get-CloudFormation -accessKey $accessKey -secretKey $secretKey -stackName $stackName
        $status = $stack.Status
        Start-Sleep -seconds 10
        $time += 10
    }
    Write-Host "CloudFormation delete-complete after $time seconds $stackName"
}

когда Delete-CloudFormation работает, я получаю исключение:

The term 'Get-CloudFormation' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again.
+ CategoryInfo          : ObjectNotFound: (Get-CloudFormation:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Зачем? И как мне это исправить?

Я нашел 7152090, который мне кажется похожим, но звонит Start-Job с -InitializationScript { Get-CloudFormation } дает примерно ту же ошибку.

Если я позвоню Start-Job с -InitializationScript { Import-Module ".\awsutils.psm1" } затем . это каталог документов моего профиля. Даже если я свяжу переменную с Get-Location вне Start-Job и называть это как -InitializationScript { Import-Module "$location\awsutils.psm1" },

4 ответа

Переместить ваш модуль awsutils.psm1 в каноническом пути для модулей powershell:

$env:userprofile\documents\WindowsPowerShell\Modules\awsutils"

затем инициализировать старт-работу, как это

-InitializationScript { Import-Module awsutils }

Протестировано с моими пользовательскими модулями и начальными работами.

попробуйте также, если вы не хотите переместить PSM1 это:

-InizializationScript { import-module -name c:\yourpath\yourmodulefolder\ }

где yourmoduleforder содержит только один файл psm1.

Фоновые задания - это автономные вещи. Они не являются отдельными ресурсами для совместного использования потоков, они фактически выполняются в совершенно новом процессе PowerShell.exe. Поэтому я думаю, что вам нужно будет использовать Import-Module внутри вашего блока скриптов, чтобы ваши члены модуля были там доступны.

То, что я в итоге делал, это настройка $env:WhereAmI = Get-Location до звонка Start-Job, а затем меняется на -InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }, После Start-Job позвони, я позвонил Remove-Item env:\WhereAmI очистить.

(Я хотел найти решение, которое не требовало бы от меня разработки модуля в $PSModulePath, потому что тогда управление исходным кодом немного сложнее в настройке.)

Спасибо за ответы.

$root = $PSScriptRoot

$initScript = [scriptblock]::Create("Import-Module -Name '$root\Modules\Publish-Assigned_CB_Reports.psm1'")

$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList
Другие вопросы по тегам