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

Я пишу немного 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 ]

7 голосов
/ 22 февраля 2012

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

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

затем инициализируйте стартовое задание следующим образом

-InitializationScript { Import-Module awsutils }

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

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

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

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

2 голосов
/ 22 февраля 2012

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

0 голосов
/ 20 октября 2015
$root = $PSScriptRoot

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

$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList
0 голосов
/ 22 февраля 2012

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

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

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

...