我正在编写一些powershell,以便在单个模块中与AWS API对话。我已经编写了一个函数Get-CloudFormation
,它返回CloudFormation的状态。我编写了另一个函数Delete-CloudFormation
,在发出delete-CF API请求后,尝试启动一个作业,该作业使用我的Get-CloudFormation
轮询CloudFormation的状态。
我在Get-CloudFormation
上调用Export-ModuleMember
(但不是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,我认为这是类似的,但用-InitializationScript { Get-CloudFormation }
调用Start-Job
会给出大致相同的错误。
如果我用-InitializationScript { Import-Module ".awsutils.psm1" }
调用Start Job,那么.
就是我的配置文件的文档目录。即使我在Start-Job
之外将一个变量绑定到Get-Location
并像-InitializationScript { Import-Module "$locationawsutils.psm1" }
一样调用它。
在powershell模块的规范路径中移动模块awsutils.psm1
:
$env:userprofiledocumentsWindowsPowerShellModulesawsutils"
然后像这个一样初始化启动作业
-InitializationScript { Import-Module awsutils }
用我的自定义模块测试并开始工作。
如果你不想移动你的psm1,也可以试试这个:
-InizializationScript { import-module -name c:yourpathyourmodulefolder }
其中CCD_ 20仅包含一个psm1文件。
后台作业是自主的。它们不是一个单独的线程共享资源,它们实际上是在一个全新的PowerShell.exe进程中运行的。因此,我认为您需要在脚本块中使用Import-Module
,以使模块成员在那里可用。
我最终做的是在调用Start-Job
之前设置$env:WhereAmI = Get-Location
,然后更改为-InitializationScript { Import-Module "$env:WhereAmIawsutils.psm1 }
。在Start-Job
调用之后,我调用Remove-Item env:WhereAmI
进行清理。
(我想要一个不需要我在$PSModulePath中开发模块的解决方案,因为这样设置源代码控制会有点困难。)
感谢您的回复。
$root = $PSScriptRoot
$initScript = [scriptblock]::Create("Import-Module -Name '$rootModulesPublish-Assigned_CB_Reports.psm1'")
$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList