I'm writing some powershell to talk to the AWS API, in a single module. I have written one function, Get-CloudFormation
, which returns the status of a CloudFormation. I've written another function, Delete-CloudFormation
, which after firing off a delete-CF API request, tries to start a job which polls the status of the CloudFormation using my Get-CloudFormation
.
I call Export-ModuleMember
on Get-CloudFormation
(but not Delete-CloudFormation
; that's a private function). Get-CloudFormation
is defined earlier in the module-file than Delete-CloudFormation
.
My Start-Job
call (inside Delete-CloudFormation
) looks like:
$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"
}
When Delete-CloudFormation
runs, I get an exception:
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
Why? And how do I fix it?
I found 7152090 which I think is similar, but calling Start-Job
with -InitializationScript { Get-CloudFormation }
gives roughly the same error.
If I call Start-Job with -InitializationScript { Import-Module ".\awsutils.psm1" }
then .
is my profile's documents directory. Even if I bind a variable to Get-Location
outside the Start-Job
and call it like -InitializationScript { Import-Module "$location\awsutils.psm1" }
.
move you module awsutils.psm1
in the canonical path for powershell modules:
$env:userprofile\documents\WindowsPowerShell\Modules\awsutils"
then initialize start-job like this
-InitializationScript { Import-Module awsutils }
Tested with my custom modules and start-job works.
try also, if you don't want move your psm1 this:
-InizializationScript { import-module -name c:\yourpath\yourmodulefolder\ }
where yourmoduleforder
contain only one psm1 file.
Background jobs are autonomous things. They aren't a separate thread sharing resources, they are actually run in a whole new PowerShell.exe process. So I think you will need to use Import-Module
inside your script block to have you module members available there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With