我在单个模块中编写了一些Powershell来与AWS API进行通信。我编写了一个函数Get-CloudFormation
,该函数返回CloudFormation的状态。我编写了另一个函数Delete-CloudFormation
,在触发delete-CF API请求之后,该函数试图启动一个使用Get-CloudFormation
轮询CloudFormation状态的作业。
我在Export-ModuleMember
上调用Get-CloudFormation
(但不是Delete-CloudFormation
;这是一个私有(private)函数)。 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,则.
是我的个人资料的文档目录。即使我将变量绑定(bind)到Get-Location
之外的Start-Job
并像-InitializationScript { Import-Module "$location\awsutils.psm1" }
一样调用它。 最佳答案
在Powershell模块的规范路径中将模块awsutils.psm1
移动:
$env:userprofile\documents\WindowsPowerShell\Modules\awsutils"
然后像这样初始化开始作业
-InitializationScript { Import-Module awsutils }
用我的自定义模块和入门作品进行了测试。
如果您不想移动psm1,也可以尝试以下操作:
-InizializationScript { import-module -name c:\yourpath\yourmodulefolder\ }
其中
yourmoduleforder
仅包含一个psm1文件。关于powershell - 如何调用Start-Job,它依赖于与调用Start-Job的功能在同一Powershell模块中的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9395673/