如何调用Start-Job,它取决于与调用Start-Job的函数相同的PowerShell模块中的函数?

时间:2012-02-22 13:24:03

标签: powershell jobs powershell-v2.0 powershell-jobs

我正在编写一些PowerShell,以便在单个模块中与AWS API进行通信。我编写了一个函数Get-CloudFormation,它返回CloudFormation的状态。我编写了另一个函数Delete-CloudFormation,在启动了删除-CF API请求后,尝试启动一个使用我的Get-CloudFormation轮询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 }一起调用会产生大致相同的错误。

如果我使用-InitializationScript { Import-Module ".\awsutils.psm1" }调用Start-Job,则.是我的个人资料的文档目录。即使我将变量绑定到Get-Location之外的Start-Job并将其称为-InitializationScript { Import-Module "$location\awsutils.psm1" }

4 个答案:

答案 0 :(得分:7)

在powershell模块的规范路径中移动模块awsutils.psm1

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

然后像这样初始化start-job

-InitializationScript { Import-Module awsutils }

使用我的自定义模块和初始作业进行测试。

另外,如果你不想移动你的psm1:

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

其中yourmoduleforder只包含一个psm1文件。

答案 1 :(得分:2)

后台工作是自主的事情。它们不是单独的线程共享资源,它们实际上是在一个全新的PowerShell.exe进程中运行的。所以我认为您需要在脚本块中使用Import-Module来让模块成员在那里可用。

答案 2 :(得分:0)

我最终做的是在致电$env:WhereAmI = Get-Location之前设置Start-Job,然后更改为-InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }Start-Job致电后,我致电Remove-Item env:\WhereAmI进行清理。

(我想要一个不需要我在$ PSModulePath中开发模块的解决方案,因为然后源控制设置起来会有点痛苦。)

感谢您的回复。

答案 3 :(得分:0)

$root = $PSScriptRoot

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

$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList