К удаленной команде можно передать объект типа 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
вызывает некоторые другие функции, определенные на локальной машине, вам также придется передать их. Поэтому этот метод полезен только для действительно простых функций. Для более сложных рассмотрим их инкапсуляцию в модуль и установку этого модуля на удаленную машину.
Код знак функции в качестве модуля, то на удаленном клиенте просто импортировать этот модуль из сети. – user4317867