2012-02-22 20 views
8

Sto scrivendo un powershell per parlare con l'API AWS, in un singolo modulo. Ho scritto una funzione, Get-CloudFormation, che restituisce lo stato di una CloudFormation. Ho scritto un'altra funzione, Delete-CloudFormation, che dopo aver sparato una richiesta dell'API delete-CF, tenta per avviare un lavoro che esegue il polling dello stato di CloudFormation usando il mio Get-CloudFormation.Come si chiama Start-Job che dipende da una funzione nello stesso modulo PowerShell della funzione che chiama Start-Job?

Io chiamo Export-ModuleMember su Get-CloudFormation (ma non Delete-CloudFormation; questa è una funzione privata). Get-CloudFormation è definito in precedenza nel file di modulo di Delete-CloudFormation.

mio Start-Job chiamata (all'interno Delete-CloudFormation) assomiglia:

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

Quando Delete-CloudFormation piste, ottengo un'eccezione:

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 

Perché? E come lo aggiusto?

Ho trovato 7152090 che penso sia simile, ma chiamando Start-Job con -InitializationScript { Get-CloudFormation } dà all'incirca lo stesso errore.

Se chiamo Start-Job con -InitializationScript { Import-Module ".\awsutils.psm1" } quindi . è la directory dei documenti del mio profilo. Anche se associo una variabile a all'esterno dello Start-Job e la chiamo come -InitializationScript { Import-Module "$location\awsutils.psm1" }.

risposta

5

mossa è il modulo awsutils.psm1 nel percorso canonico per moduli PowerShell:

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

poi inizializzare start-lavoro come questo

-InitializationScript { Import-Module awsutils } 

Testato con i miei moduli personalizzati e Start-Job funziona.

Prova anche, se non si vuole spostare il PSM1 questo:

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

dove yourmoduleforder contengono solo file PSM1.

+1

Immagino che se l'OP voleva essere più dinamico, lo script principale poteva copiare il modulo nella cartella C: \ Windows ... \ Powershell in modo che potesse usare solo Import-Module senza un percorso completo. Potrebbe essere rimosso più tardi ... hehe –

+0

sicuro .. è un'idea! :) –

2

I lavori in background sono cose autonome. Non sono risorse di condivisione thread separate, vengono effettivamente eseguite in un intero processo PowerShell.exe. Quindi penso che dovrai usare Import-Module all'interno del tuo blocco di script per avere i membri del modulo disponibili lì.

0

Quello che ho finito per fare stava tramontando $env:WhereAmI = Get-Location prima della chiamata a Start-Job, e poi passare a -InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }. Dopo la chiamata Start-Job, ho chiamato Remove-Item env:\WhereAmI per pulire.

(volevo una soluzione che non richiedesse me essere in via di sviluppo il modulo all'interno del $ PSModulePath, perché allora fonte di controllo è un po 'più doloroso da configurare.)

Grazie per le risposte.

0
$root = $PSScriptRoot 

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

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

Potresti aggiungere qualche spiegazione alla tua risposta? Le risposte al solo codice sono disapprovate su SO. – honk