Нужна помощь, чтобы передать и выполнить функцию с аргументами в Scriptblock, чтобы выполнить его удаленно - PullRequest
0 голосов
/ 16 мая 2019

Я пишу приложение, которое использует функцию для обработки данных.На этом этапе мне нужно выполнить скрипт-блок на удаленном компьютере, который использует эту функцию и получает ее в качестве параметра.Код, который я тестирую, выполняет это, но выдает ошибку и ошибку вместе с правильным результатом.Нужен способ добиться того же результата без ошибки.

   function MyFunction{
      param ($String)
      Write-Host "this is: $String"   
   }

   $ScriptBlock = {
      param ($MyFunction, $String)           
      invoke-expression $MyFunction.ScriptBlock.Invoke($String)    
   }

   $MyFunction = (get-item function:MyFunction)
   $String = "123"
   Invoke-Command -ComputerName <RemoteComputerName> -ScriptBlock $ScriptBlock - 
   Credential $DomainCred -ArgumentList ($MyFunction,$String)

Это результат, который я получаю - частичный результат плюс ошибка

    this is: 123
    Cannot convert '' to the type 'System.String' required by parameter 'Command'. Specified method is not supported.
        + CategoryInfo          : InvalidArgument: (:) [Invoke-Expression], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeExpressionCommand
        + PSComputerName        : <RemoteComputerName>

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Решение найдено благодаря powershell.org

заменить в блоке сценариев

    invoke-expression $MyFunction.ScriptBlock.Invoke($String)  

             with

   [ScriptBlock]::Create($MyFunction.ScriptBlock).Invoke($String)
0 голосов
/ 16 мая 2019

Передайте определение ScriptBlock напрямую, а не объект FunctionInfo, возвращаемый Get-Item function:\MyFunction:

$ScriptBlock = {
  param(
    [ScriptBlock]$MyFunction,
    [string]$String
  )

  $MyFunction.Invoke($String)
}
Invoke-Command -ComputerName <RemoteComputerName> -ScriptBlock $ScriptBlock -ArgumentList ${function:myfunction},$string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...