2016-09-16 7 views
1

У меня есть сценарий Powershell с некоторыми функциями, и одна из этих функций я хочу запустить удаленно (она принимает параметры и возвращает void) из блока Invoke-Command.Выполнение локально заданной функции удаленно

Я использую Powershell 5. Как я могу добиться этого?

Большое спасибо!

+0

Код знак функции в качестве модуля, то на удаленном клиенте просто импортировать этот модуль из сети. – user4317867

ответ

0

К удаленной команде можно передать объект типа FunctionInfo, а затем воссоздать функцию с другой стороны. Допустим, у вас есть функция:

function foo($a) { write-host "foo says: $a" } 

Тогда вы можете получить FunctionInfo:

$f = get-item function:\foo 

Теперь передать его в качестве аргумента в удаленную команду:

Invoke-Command "computer1" { 
    param($fobj) 
    invoke-expression "function $($fobj.name) { $($fobj.ScriptBlock) }" 
    foo "hello!" 
} -ArgumentList $f 

(Обратите внимание, что вы не можете просто делаем set-item function:\foo $fobj, т.к. на другой стороне $fobj есть тип PSObject, нет FunctionInfo).

Если foo вызывает некоторые другие функции, определенные на локальной машине, вам также придется передать их. Поэтому этот метод полезен только для действительно простых функций. Для более сложных рассмотрим их инкапсуляцию в модуль и установку этого модуля на удаленную машину.

0

Здесь вы можете передать функцию в качестве аргумента как упоминалось выше, но вместо того, чтобы использовать Get-Item лучше использовать $Variable = Get-Content Function:\Foo и передать его в invoke-Command как использование Invoke-Expression не лучшая практика.

Invoke-Command -ComputerName -$Server -ScriptBlock {Param($Var1) 
$Var1 #This will execute your function as usual. 
} -ArgumentList $Variable 

$ Var1 будет типа System.Management.Automation.FunctionInfo

Если у вас есть параметры для вашей функции, Вы должны пройти то, как хорошо с

Invoke-Command -ComputerName -$Server -ScriptBlock {Param($Var1,$Par1,$Par2) 
$Var1 $Par1 $Par2 #This will execute your function as usual. 
} -ArgumentList $Variable,$Param1,$Param2 

Было бы неплохо, если бы вы читали Get-Help Invoke-Command -Parameter Argumentlist

и

https://powershell.org/2012/08/06/ebook-secrets-of-powershell-remoting/

С уважением,

kvprasoon

Смежные вопросы