2011-12-09 19 views
25

मैं एक PowerShell स्क्रिप्ट लिख रहा हूं जो Invoke-Command और उसके -ScriptBlock पैरामीटर का उपयोग कर रिमोट होस्ट पर कमांड निष्पादित करेगा। उदाहरण के लिए,तर्कों के साथ फ़ंक्शन पर Invoke-Command -ScriptBlock का उपयोग

function Foo { 
    ... 
    return "foo" 
} 
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo} 

यह ठीक काम करता है। मैं अब क्या करना चाहता हूं वही बात है, लेकिन स्थानीय तर्कों के साथ एक समारोह को कॉल करें। उदाहरण के लिए,

function Bar { 
    param([String] $a, [Int] $b) 
    ... 
    return "foo" 
} 
[String] $x = "abc" 
[Int] $y = 123 
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo($x,$y)} 

लेकिन यह काम नहीं करता है:

आह्वान-कमान: पैरामीटर 'ScriptBlock' पर तर्क मान्य नहीं कर सकता। तर्क शून्य है। एक गैर-शून्य तर्क की आपूर्ति करें और को फिर से आदेश दें।

मैं कैसे एक -ScriptBlock तर्क के साथ एक स्थानीय समारोह है कि के साथ आह्वान-कमान का उपयोग कर सकते हैं?

मुझे एहसास है कि मैं पूरे फ़ंक्शन और पैरामीटर को एक बड़े कोड ब्लॉक में लपेट सकता हूं, लेकिन यह मेरी राय में ऐसा करने का एक साफ तरीका नहीं है।

उत्तर

41

मुझे लगता है कि आप चाहते हैं:

function Foo ($a,$b) { 
    $a 
    $b 
    return "foo" 
} 

$x = "abc" 
$y= 123 

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y 
+0

धन्यवाद आदमी, पूरी तरह से काम करता है! मैं परम के संयोजन के साथ गड़बड़ कर रहा था() + - कोई भाग्य के साथ आर्टमेंट्स। –

+0

ने मुझे इस समाधान को खोजने में कई घंटे लगे ;-) सत्रों को निर्यात/आयात करने से काफी बेहतर धन्यवाद! – icnivad

+0

मेरा मानना ​​है कि सही प्रारूप '-ScriptBlock {$ फ़ंक्शन: Foo}' (नोट '$' स्थिति) – Mourndark

7

आप ब्लॉक में कार्यों को लपेट सकते हैं और ब्लॉक पास कर सकते हैं;

$a = { 
    function foo{} 
    foo($args) 
} 

$a.invoke() // Locally 

$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely 

हालांकि यह शायद ही कभी सुरुचिपूर्ण है।

+0

मैं इस से बचने के लिए चाहते हैं। –

2

यह भी काम करता है:

function foo 
{ 
    param([string]$hosts, [string]$commands) 
    $scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands) 
    $hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock } 
} 
संबंधित मुद्दे