2012-01-05 5 views
11

मेरे पास निम्न कोड है।पावरहेल स्टार्ट-जॉब -स्क्रिप्टब्लॉक एक ही फ़ाइल में परिभाषित फ़ंक्शन को पहचान नहीं सकता है?

function createZip 
{ 
Param ([String]$source, [String]$zipfile) 
Process { echo "zip: $source`n  --> $zipfile" } 
} 

try { 
    Start-Job -ScriptBlock { createZip "abd" "acd" } 
} 
catch { 
    $_ | fl * -force 
} 
Get-Job | Wait-Job 
Get-Job | receive-job 
Get-Job | Remove-Job 

हालांकि, स्क्रिप्ट निम्न त्रुटि देता है।

Id    Name   State  HasMoreData  Location    Command     
--    ----   -----  -----------  --------    -------     
309    Job309   Running True   localhost   createZip "a... 
309    Job309   Failed  False   localhost   createZip "a... 
Receive-Job : The term 'createZip' 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. 
At line:17 char:22 
+ Get-Job | receive-job <<<< 
    + CategoryInfo   : ObjectNotFound: (function:createZip:String) [Receive-Job], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

ऐसा लगता समारोह नाम start-job की स्क्रिप्ट ब्लॉक के अंदर पहचाना नहीं जा सकता। मैंने function:createZip भी कोशिश की।

उत्तर

13

Start-Job वास्तव में PowerShell.exe का एक और उदाहरण स्पिन करता है जिसमें आपके createZip फ़ंक्शन नहीं होते हैं। आप यह सब एक स्क्रिप्ट ब्लॉक में शामिल करने की जरूरत:

$createZip = { 
    param ([String]$source, [String]$zipfile) 
    Process { echo "zip: $source`n  --> $zipfile" } 
} 

Start-Job -ScriptBlock $createZip -ArgumentList "abd", "acd" 

पृष्ठभूमि नौकरी से एक त्रुटि संदेश लौटने एक उदाहरण:

$createZip = { 
    param ([String] $source, [String] $zipfile) 

    $output = & zip.exe $source $zipfile 2>&1 
    if ($LASTEXITCODE -ne 0) { 
     throw $output 
    } 
} 

$job = Start-Job -ScriptBlock $createZip -ArgumentList "abd", "acd" 
$job | Wait-Job | Receive-Job 

भी ध्यान रखें कि एक throw काम वस्तु State हो जाएगा का उपयोग कर "द्वारा असफल "तो आप केवल उन नौकरियों को प्राप्त कर सकते हैं जो विफल: Get-Job -State Failed

+0

धन्यवाद। ऐसा लगता है कि PowerShell के किसी अन्य उदाहरण में उठाए गए अपवाद को कैद नहीं किया जा सकता है। अपवाद को पकड़ने का सबसे अच्छा तरीका क्या है? – ca9163d9

+0

@NickW आप निश्चित रूप से कर सकते हैं। मेरा अद्यतन उत्तर देखें। –

+1

इसके लिए धन्यवाद - मेरे पास एक समान सवाल था और अब मैं सुनहरा हूँ! – marceljg

5

आप अभी भी शुरू नौकरी और प्राप्त नौकरी, और अधिक आसानी से अपने समारोह डिबग करने के लिए चाहते हैं का उपयोग कर के लिए नए हैं, तो इस फ़ॉर्म का प्रयास करें:

$createZip = { 
    function createzipFunc { 
    param ([String]$source, [String]$zipfile) 
    Process { echo "zip: $source`n  --> $zipfile" } 
    } 
    #other funcs and constants here if wanted... 
    } 
    # some secret sauce, this defines the function(s) for us as locals 
    invoke-expression $createzip 

    #now test it out without any job plumbing to confuse you 
    createzipFunc "abd" "acd" 

    # once debugged, unfortunately this makes calling the function from the job 
    # slightly harder, but here goes... 
    Start-Job -initializationScript $createZip -scriptblock {param($a,$b) ` 
createzipFunc $a $b } -ArgumentList "abc","def" 

सभी तथ्य मैं परिभाषित नहीं किया द्वारा सरल नहीं की मेरे काम के रूप में एक साधारण फिल्टर के रूप में मेरा काम है, लेकिन जो मैंने किया क्योंकि मैं अंत में अपने काम में कई कार्यों को पारित करना चाहता था।

इस धागे को खोदने के लिए खेद है, लेकिन इसने मेरी समस्या को भी हल किया और उस पर सुंदरता से हल किया। और इसलिए मुझे बस थोड़ा सा सॉस जोड़ना पड़ा जो मैंने अपनी शक्तियों की नौकरी को डीबग करते समय लिखा था।

+2

मुझे यह दृष्टिकोण पसंद है। जोड़ने के लिए एक बात कभी-कभी 'आमंत्रण-अभिव्यक्ति' शिकायत करेगी 'आमंत्रण-अभिव्यक्ति: पैरामीटर' कमांड 'का मूल्यांकन नहीं कर सकता क्योंकि इसकी तर्क को स्क्रिप्ट ब्लॉक के रूप में निर्दिष्ट किया गया है और इसमें कोई इनपुट नहीं है। एक स्क्रिप्ट ब्लॉक इनपुट के बिना मूल्यांकन नहीं किया जा सकता है। मैंने पाया कि यदि आप एक स्ट्रिंग 'invoke-expression "$ createzip" के रूप में चर को पास करते हैं, तो उस समस्या को हल करता है। – Adarsha

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