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:
Wenn Delete-CloudFormation
läuft, bekomme ich eine Ausnahme:
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.
verschiebe das Modul awsutils.psm1
in den kanonischen Pfad für Powershell-Module:
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.
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.
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.
Tags und Links powershell powershell-v2.0 jobs powershell-jobs