2012-02-22 4 views
8

मैं एक मॉड्यूल में एडब्ल्यूएस एपीआई से बात करने के लिए कुछ शक्तियां लिख रहा हूं। मैंने एक समारोह लिखा है, Get-CloudFormation, जो क्लाउडफॉर्मेशन की स्थिति देता है। मैंने एक और फ़ंक्शन लिखा है, Delete-CloudFormation, जो डिलीट-सीएफ एपीआई अनुरोध को फायर करने के बाद, को नौकरी शुरू करने की कोशिश करता है जो क्लाउडफॉर्मेशन की स्थिति को Get-CloudFormation का उपयोग करके मतदान करता है।मैं स्टार्ट-जॉब को कैसे कॉल करूं जो समान शक्तिशक्ति मॉड्यूल में फ़ंक्शन पर निर्भर करता है जैसे कि फ़ंक्शन कॉलिंग स्टार्ट-जॉब?

मैं Get-CloudFormation पर Export-ModuleMember पर कॉल करता हूं (लेकिन 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 के बाहर एक चर को बाध्य करता हूं और इसे -InitializationScript { Import-Module "$location\awsutils.psm1" } पर कॉल करता हूं।

उत्तर

5

चाल आप powershell मॉड्यूल के लिए विहित पथ में awsutils.psm1 मॉड्यूल:

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

तो यह

-InitializationScript { Import-Module awsutils } 

अपने कस्टम मॉड्यूल के साथ परीक्षण किया गया की तरह शुरू काम प्रारंभ और स्टार्ट-काम काम करता है।

भी प्रयास करते हैं, तो आप अपने psm1 लिए कदम यह नहीं चाहता है, तो:

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

जहां yourmoduleforder केवल एक psm1 फ़ाइल होते हैं।

+1

मुझे लगता है कि यदि ओपी अधिक गतिशील होना चाहता था तो मुख्य स्क्रिप्ट मॉड्यूल को सी: \ विंडोज ... \ पावरहेल मॉड्यूल निर्देशिका में कॉपी कर सकती है ताकि यह पूर्ण पथ के बिना आयात-मॉड्यूल का उपयोग कर सके। इसे बाद में हटाया जा सकता है ... हे –

+0

यकीन है .. यह एक विचार है! :) –

2

पृष्ठभूमि नौकरियां स्वायत्त चीजें हैं। वे एक अलग थ्रेड साझाकरण संसाधन नहीं हैं, वे वास्तव में एक पूरी नई PowerShell.exe प्रक्रिया में चलाए जाते हैं। तो मुझे लगता है कि आपको अपने स्क्रिप्ट ब्लॉक के अंदर Import-Module का उपयोग करने की आवश्यकता होगी ताकि आप वहां मॉड्यूल के सदस्य उपलब्ध हो सकें।

0

मैं जो कर रहा हूं वह को Start-Job पर कॉल करने से पहले सेट कर रहा था, और फिर -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

संबंधित मुद्दे