2012-02-22 8 views
8

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" }.

Odpowiedz

5

ruch ty moduł awsutils.psm1 w kanonicznej ścieżki dla modułów powershell:

$env:userprofile\documents\WindowsPowerShell\Modules\awsutils" 

następnie zainicjować rozpoczęcie pracy jak to

-InitializationScript { Import-Module awsutils } 

testowane z moich własnych modułów i rozpoczęcie pracy działa.

spróbować też, jeśli nie chcesz przenieść swój psm1 to:

-InizializationScript { import-module -name c:\yourpath\yourmodulefolder\ } 

gdzie yourmoduleforder zawierać tylko jeden plik psm1.

+1

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 –

+0

pewnie .. to jest pomysł! :) –

2

Prace w tle są autonomiczne. Nie są one osobnymi zasobami do dzielenia wątków, działają w zupełnie nowym procesie PowerShell.exe. Więc myślę, że będziesz musiał użyć Import-Module w swoim bloku skryptu, aby mieć tam członków twojego modułu.

0

Co skończyło się robi było ustawienie $env:WhereAmI = Get-Location przed wywołaniem Start-Job, a następnie zmienia się -InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }. Po wywołaniu Start-Job zadzwoniłem pod numer Remove-Item env:\WhereAmI, aby przeprowadzić czyszczenie.

(chciałem rozwiązanie, które nie wymaga mnie do opracowania modułu wewnątrz $ PSModulePath, bo wtedy źródło sterowania jest trochę bardziej bolesne założyć).

Dzięki za odpowiedzi.

0
$root = $PSScriptRoot 

$initScript = [scriptblock]::Create("Import-Module -Name '$root\Modules\Publish-Assigned_CB_Reports.psm1'") 

$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList 
+0

Czy możesz dodać wyjaśnienie do swojej odpowiedzi? Odpowiedzi tylko na kod są niezadowolone na SO. – honk

Powiązane problemy