Как вызвать 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