2012-02-22 30 views
8

Tôi đang viết một số quyền năng để nói chuyện với API AWS, trong một mô-đun duy nhất. Tôi đã viết một hàm, Get-CloudFormation, trả về trạng thái của CloudFormation. Tôi đã viết một hàm khác, Delete-CloudFormation, sau khi kích hoạt yêu cầu xóa API CF, cố gắng để bắt đầu công việc thăm dò ý kiến ​​của CloudFormation bằng cách sử dụng Get-CloudFormation của tôi.Làm cách nào để gọi Start-Job phụ thuộc vào chức năng trong cùng một mô-đun PowerShell như chức năng gọi là Start-Job?

Tôi gọi Export-ModuleMember trên Get-CloudFormation (nhưng không phải Delete-CloudFormation; đó là chức năng riêng tư). Get-CloudFormation được xác định trước đó trong tệp mô-đun hơn Delete-CloudFormation.

Start-Job cuộc gọi của tôi (bên Delete-CloudFormation) trông giống như:

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

Khi Delete-CloudFormation chạy, tôi nhận được một ngoại lệ:

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 

Tại sao? Và làm thế nào để sửa nó?

Tôi đã tìm thấy 7152090 mà tôi nghĩ là tương tự, nhưng gọi số Start-Job với số -InitializationScript { Get-CloudFormation } cho cùng một lỗi.

Nếu tôi gọi Start-Job với -InitializationScript { Import-Module ".\awsutils.psm1" } thì . là thư mục tài liệu của tiểu sử của tôi. Ngay cả khi tôi liên kết biến số với Get-Location bên ngoài Start-Job và gọi nó là -InitializationScript { Import-Module "$location\awsutils.psm1" }.

Trả lời

5

di chuyển bạn mô-đun awsutils.psm1 trong con đường kinh điển cho module PowerShell:

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

sau đó khởi đầu công việc như thế này

-InitializationScript { Import-Module awsutils } 

Thử nghiệm với module tùy chỉnh của tôi và bắt đầu công việc hoạt động.

cũng cố gắng, nếu bạn không muốn di chuyển psm1 của bạn này:

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

nơi yourmoduleforder chỉ chứa một tập tin psm1.

+1

Tôi đoán nếu OP muốn năng động hơn, tập lệnh chính có thể sao chép mô-đun vào thư mục mô-đun C: \ Windows ... \ Powershell để có thể sử dụng Import-Module mà không có đường dẫn đầy đủ. Nó có thể được gỡ bỏ sau ... hehe –

+0

chắc chắn .. đó là một ý tưởng! :) –

2

Công việc nền là những thứ tự trị. Chúng không phải là một tài nguyên chia sẻ luồng riêng biệt, chúng thực sự chạy trong một quá trình PowerShell.exe hoàn toàn mới. Vì vậy, tôi nghĩ rằng bạn sẽ cần phải sử dụng Import-Module bên trong khối tập lệnh của bạn để có các thành viên mô-đun có sẵn ở đó.

0

Điều tôi đã làm cuối cùng là thiết lập $env:WhereAmI = Get-Location trước khi gọi đến Start-Job và sau đó thay đổi thành -InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }. Sau cuộc gọi Start-Job, tôi gọi số Remove-Item env:\WhereAmI để dọn dẹp.

(Tôi muốn có một giải pháp mà không yêu cầu tôi phải phát triển các mô-đun trong $ PSModulePath, bởi vì khi đó nguồn điều khiển là đau đớn nhiều hơn một chút để thiết lập.)

Cảm ơn câu trả lời.

0
$root = $PSScriptRoot 

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

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

Bạn có thể thêm một số giải thích cho câu trả lời của mình không? Các câu trả lời chỉ có mã được tán thành trên SO. – honk

Các vấn đề liên quan