Попытка закодировать функцию, которая принимает блок сценария с параметрами и списком аргументов, редактирует этот блок сценария, а затем запускает команду вызова

Я редактирую функцию, которая будет вызывать команду непосредственно на виртуальной машине. Проблема, с которой я постоянно сталкиваюсь, заключается в том, что если кто-то передает объявление функции как блок сценария, я получаю сообщение об ошибке при вызове create, потому что params() не находится в верхней части блока сценария.

Пытаюсь понять, как я могу сначала set-fulllanguage выполнить функцию с параметрами.

function Invoke-DirectOnVM
{
    [CmdletBinding()]
    Param (
    [Parameter(Mandatory = $true)]
    [CloudEngine.Configurations.EceInterfaceParameters]
    $Parameters,

    [Parameter(Mandatory = $true)]
    [String[]]$VMNames,

    [Parameter(Mandatory = $true)]
    [Object]$VMCredential,

    [Parameter(Mandatory = $true)]
    [ScriptBlock]$ScriptBlock,

    [Object[]]$ArgumentList = $null
)
{
    Invoke-Command -VMName $localVMs -Credential $using:VMCredential -ScriptBlock ([ScriptBlock]::Create($("Import-Module OpenUpSession; Set-FullLanguage; `r`n" + $using:ScriptBlock)))
}

person Mark    schedule 26.04.2018    source источник
comment
Не форсируйте скриптовый блок... -ScriptBlock {Import-Module OpenUpSession; Set-FullLanguage; $using:ScriptBlock.Invoke($using:ArgumentList)}   -  person TheMadTechnician    schedule 26.04.2018
comment
Пробовал это. Получил ошибку: + ... -FullLanguage; $using:scriptBlock.Invoke($using:argumentList)} -Argum ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ Выражение не допускается в выражении Using.   -  person Mark    schedule 26.04.2018
comment
Вы не использовали то, что я поставил, я вижу } -Argum в вашей ошибке, но этого нет ни в вашем коде, ни в моем коде. Пожалуйста, сделайте код, который вы публикуете, точным представлением кода, с которым вы работаете.   -  person TheMadTechnician    schedule 26.04.2018
comment
Справедливо. Я удалил бит кода, но результат тот же. Кажется, ошибка связана с $using:ScriptBlock и .Invoke   -  person Mark    schedule 26.04.2018
comment
Это можно исправить... -ScriptBlock {Param($ScriptBlock,$ArgumentList);Import-Module OpenUpSession; Set-FullLanguage; $ScriptBlock.Invoke($ArgumentList)} -ArgumentList $ScriptBlock, $ArgumentList   -  person TheMadTechnician    schedule 26.04.2018


Ответы (1)


Удалите $using: из блока сценария, и он должен работать правильно. Я позволил себе немного почистить код. Результат выглядит так:

function Invoke-DirectOnVM
{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [CloudEngine.Configurations.EceInterfaceParameters]
            $Parameters,

        [Parameter(Mandatory)]
        [String[]]
            $VMNames,

        [Parameter(Mandatory)]
            $VMCredential,

        [Parameter(Mandatory)]
        [ScriptBlock]
            $ScriptBlock,

        [Parameter()]
        [Object[]]
            $ArgumentList = $null
    )

    $PSBoundParameters.Remove("ScriptBlock")

    Invoke-Command @PSBoundParameters -ScriptBlock ([ScriptBlock]::Create( "Import-Module OpenUpSession; Set-FullLanguage; `r`n" + $ScriptBlock ))
}
person Bruce Payette    schedule 26.04.2018