Wie rufe ich Start-Job auf, der von einer Funktion im selben Powershell-Modul abhängt wie die Funktion, die Start-Job aufruft?

8

Ich schreibe eine Powershell, um mit der AWS-API in einem einzigen Modul zu kommunizieren. Ich habe eine Funktion geschrieben, Get-CloudFormation , die den Status einer CloudFormation zurückgibt. Ich habe eine andere Funktion geschrieben, Delete-CloudFormation , die nach dem Abfeuern einer Lösch-CF-API-Anfrage versucht einen Job zu starten, der den Status der CloudFormation mithilfe meiner Get-CloudFormation abfragt.

Ich rufe Export-ModuleMember auf Get-CloudFormation auf (aber nicht Delete-CloudFormation ; das ist eine private Funktion). Get-CloudFormation ist früher in der Moduldatei definiert als Delete-CloudFormation .

Mein Start-Job -Aufruf (in Delete-CloudFormation ) sieht folgendermaßen aus:

%Vor%

Wenn Delete-CloudFormation läuft, bekomme ich eine Ausnahme:

%Vor%

Warum? Und wie repariere ich es?

Ich fand 7152090 was meiner Meinung nach ähnlich ist, aber den Aufruf von Start-Job mit -InitializationScript { Get-CloudFormation } ergibt ungefähr den gleichen Fehler.

Wenn ich Start-Job mit -InitializationScript { Import-Module ".\awsutils.psm1" } anrufe, dann ist . das Dokumentenverzeichnis meines Profils. Selbst wenn ich eine Variable an Get-Location außerhalb des Start-Job binde und sie wie -InitializationScript { Import-Module "$location\awsutils.psm1" } rufe.

    
Peter Mounce 22.02.2012, 13:24
quelle

4 Antworten

6

verschiebe das Modul awsutils.psm1 in den kanonischen Pfad für Powershell-Module:

%Vor%

initialisiere dann den Start-Job wie folgt

%Vor%

Getestet mit meinen benutzerdefinierten Modulen und Start-Job funktioniert.

versuche auch, wenn du deine psm1 nicht so bewegen willst:

%Vor%

wobei yourmoduleforder nur eine psm1-Datei enthält.

    
CB. 22.02.2012 13:43
quelle
2

Hintergrundjobs sind autonome Dinge. Sie sind kein separater Thread, der Ressourcen gemeinsam nutzt. Sie werden tatsächlich in einem komplett neuen PowerShell.exe-Prozess ausgeführt. Ich denke, Sie müssen Import-Module in Ihrem Skriptblock verwenden, damit Sie Modulmitglieder dort zur Verfügung haben.

    
Andy Arismendi 22.02.2012 13:44
quelle
0

Am Ende habe ich $env:WhereAmI = Get-Location vor dem Aufruf von Start-Job gesetzt und dann zu -InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 } gewechselt. Nach dem Aufruf Start-Job habe ich Remove-Item env:\WhereAmI zum Aufräumen aufgerufen.

(Ich wollte eine Lösung, bei der ich das Modul nicht innerhalb des $ PSModulePath entwickeln musste, denn dann ist die Quellcodeverwaltung etwas mühsamer einzurichten.)

Danke für die Antworten.

    
Peter Mounce 22.02.2012 17:10
quelle
0
%Vor%     
user5301791 20.10.2015 17:12
quelle