2012-02-22 40 views
8

我在單個模塊中編寫了一些與AWS API交談的PowerShell。我寫了一個函數,Get-CloudFormation,它返回CloudFormation的狀態。我已經編寫了另一個函數Delete-CloudFormation,它在發出刪除CF API請求後,嘗試開始一個作業,該作業使用我的Get-CloudFormation來輪詢CloudFormation的狀態。如何調用Start-Job,它取決於調用Start-Job的函數在相同的PowerShell模塊中的函數?

我打電話Export-ModuleMemberGet-CloudFormation(但不是Delete-CloudFormation;這是一個私人功能)。 Get-CloudFormation在模塊文件的前面定義爲Delete-CloudFormation

Start-Job調用(內Delete-CloudFormation)看起來像:

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

Delete-CloudFormation運行時,我得到一個異常:

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 

爲什麼?我該如何解決它?

我發現7152090我認爲是相似的,但撥打Start-Job-InitializationScript { Get-CloudFormation }給出了大致相同的錯誤。

如果我打電話給-InitializationScript { Import-Module ".\awsutils.psm1" }開始工作,那麼.是我的個人資料的文檔目錄。即使我將變量綁定到Start-Job之外的Get-Location,並將其稱爲-InitializationScript { Import-Module "$location\awsutils.psm1" }

回答

5

打動你模塊awsutils.psm1在規範路徑PowerShell模塊:

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

然後初始化啓動工作這樣

-InitializationScript { Import-Module awsutils } 

與我的自定義模塊測試,並開始作業工作。

嘗試另外,如果你不想讓你的移動PSM1這樣的:

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

其中yourmoduleforder只包含一個PSM1文件。

+1

我想,如果在OP想成爲更有活力的主腳本可以在模塊複製到C:\ WINDOWS \ PowerShell模塊目錄,以便它可以只使用導入模塊沒有一個完整路徑。它可以在以後刪除...嘿嘿 – 2012-02-22 13:54:52

+0

當然..這是一個想法! :) – 2012-02-22 13:59:09

2

後臺作業是自治的事情。他們不是一個單獨的線程共享資源,他們實際上是在一個全新的PowerShell.exe進程中運行。所以我認爲你需要在你的腳本塊中使用Import-Module來讓你在那裏獲得模塊成員。

0

我最終做的是在撥打Start-Job之前設置$env:WhereAmI = Get-Location,然後更改爲-InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }。撥打Start-Job後,我撥打Remove-Item env:\WhereAmI進行清理。

(我想這並沒有要求我要發展$ PSModulePath內的模塊,因爲那時源代碼控制更多的是有點痛苦成立。一個解決方案)

感謝您的答覆。

0
$root = $PSScriptRoot 

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

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

你能否給你的答案添加一些解釋?僅有代碼的答案在SO上不受歡迎。 – honk 2015-10-20 20:11:38

相關問題