Piszę niektóre powłoki, aby porozmawiać z interfejsem API AWS w jednym module. Napisałem jedną funkcję, Get-CloudFormation
, która zwraca status CloudFormation. Napisałem inną funkcję, Delete-CloudFormation
, która po wypaleniu żądania interfejsu API usuwania delete, próbuje, aby rozpocząć zadanie, które wypytuje status CloudFormation za pomocą mojego Get-CloudFormation
.Jak wywołać Start-Job, który zależy od funkcji w tym samym module powershell, co funkcja wywołująca Start-Job?
Zadzwonię pod Export-ModuleMember
na Get-CloudFormation
(ale nie Delete-CloudFormation
, to jest funkcja prywatna). Get-CloudFormation
jest zdefiniowany wcześniej w pliku modułu niż Delete-CloudFormation
.
Moja Start-Job
połączenia (wewnątrz Delete-CloudFormation
) wygląda następująco:
$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"
}
Kiedy Delete-CloudFormation
działa, otrzymuję wyjątek:
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
Dlaczego? I jak to naprawić?
Znalazłem 7152090, co według mnie jest podobne, ale wywołanie Start-Job
z -InitializationScript { Get-CloudFormation }
daje z grubsza ten sam błąd.
Jeśli zadzwonię do Start-Job z -InitializationScript { Import-Module ".\awsutils.psm1" }
, wówczas katalog dokumentów mojego profilu to .
. Nawet jeśli wiążę zmienną do Get-Location
poza Start-Job
i nazywam ją jako -InitializationScript { Import-Module "$location\awsutils.psm1" }
.
myślę, że jeśli PO chciała być bardziej dynamiczny główny skrypt może skopiować moduł do katalogu C: \ Windows ... \ Moduły PowerShell katalogu więc może po prostu użyć Import-Module bez pełnej ścieżki. Może zostać usunięty później ... hehe –
pewnie .. to jest pomysł! :) –