我正在编写一些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" }
。
答案 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