2012-02-22 19 views
8

Escribo algunas palabras clave para hablar con la API de AWS, en un único módulo. He escrito una función, Get-CloudFormation, que devuelve el estado de una CloudFormation. He escrito otra función, Delete-CloudFormation, que después de disparar una solicitud de API de eliminación de CF, intenta para iniciar un trabajo que sondea el estado de CloudFormation usando mi Get-CloudFormation.¿Cómo llamo a Start-Job que depende de una función en el mismo módulo de PowerShell que la función que llama Start-Job?

llamo Export-ModuleMember en Get-CloudFormation (pero no en Delete-CloudFormation; esa es una función privada). Get-CloudFormation se definió anteriormente en el archivo de módulo que Delete-CloudFormation.

Mi Start-Job llamada (en el interior Delete-CloudFormation) se parece a:

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

Cuando Delete-CloudFormation carreras, me sale una excepción:

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 

¿Por qué? ¿Y cómo lo arreglo?

Encontré 7152090 que creo que es similar, pero llamar a Start-Job con -InitializationScript { Get-CloudFormation } da más o menos el mismo error.

Si llamo a Start-Job con -InitializationScript { Import-Module ".\awsutils.psm1" }, entonces . es el directorio de documentos de mi perfil. Incluso si enlace una variable a Get-Location fuera del Start-Job y la llamo como -InitializationScript { Import-Module "$location\awsutils.psm1" }.

Respuesta

5

módulo de movimiento que awsutils.psm1 en la ruta canónica para los módulos de PowerShell:

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

entonces inicializar puesta en trabajo como este

-InitializationScript { Import-Module awsutils } 

Probado con mis módulos personalizados y puesta en trabajo funciona.

Pruebe también, si usted no desea mover su PSM1 esto:

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

donde yourmoduleforder contienen sólo un archivo PSM1.

+1

Supongo que si el OP desea ser más dinámico, el script principal podría copiar el módulo en el directorio C: \ Windows ... \ Powershell modules para que pueda usar Import-Module sin una ruta completa. Podría eliminarse más tarde ... jeje –

+0

seguro ... ¡es una idea! :) –

2

Los trabajos de fondo son cosas autónomas. No son recursos de intercambio de subprocesos separados, en realidad se ejecutan en un proceso completamente nuevo de PowerShell.exe. Así que creo que necesitarás usar Import-Module dentro del bloque de scripts para tener tus miembros de módulo disponibles allí.

0

Lo que terminé haciendo fue configurar $env:WhereAmI = Get-Location antes de llamar a Start-Job, y luego cambiar a -InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }. Después de la llamada Start-Job, llamé al Remove-Item env:\WhereAmI para limpiar.

(quería una solución que no requería de mí estar desarrollando el módulo dentro del $ PSModulePath, porque entonces la fuente-control es un poco más dolorosa de configurar.)

Gracias por las respuestas.

0
$root = $PSScriptRoot 

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

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

¿Podría agregar alguna explicación a su respuesta? Las respuestas de solo código están mal vistas en SO. – honk

Cuestiones relacionadas