SMA Workflows и Remoting, работа с переменными

Репост

SMA использует PowerShell Workflows, это накладывает некоторые ограничения, например при обращении к переменным или невозможность использования Invoke-Command. Для вызова команд недоступных в PowerShell Workflows можно использовать InlineScript. При этом все что “внутри” InlineScript выполняется “отдельно”, некое подобие sandbox’а.

Workflow Get-VMReplicaStatus
{
    param(
    [Paramater(mandatory=$true)]
    $VMHost,
    [Paramater(mandatory=$true)]
    $VMName
    )
    InlineScript
    {
       Invoke-Command -ComputerName $USING:VMHost -ScriptBlock {Get-VMReplication -VMName $USING:VMName}
    }
}

В данном случае переменная VMName не будет доступна в ScriptBlock’е, т.к. $USING:VMName используется для передачи переменной из PowerShell Workflow в InlineScript. Решением будет переобозначить переменную в InlineScript’е.

Workflow Get-VMReplicaStatus
{
    param(
    [Paramater(mandatory=$true)]
    $VMHost,
    [Paramater(mandatory=$true)]
    $VMName
    )
    InlineScript
    {
        $VMName = $USING:VMName
        Invoke-Command -ComputerName $USING:VMHost -ScriptBlock {param($VMName) Get-VMReplication -VMName $VMName} -ArgumentList $VMName
    }
}

Однако, Best Practice - передавать переменные как аргументы для InlineScript.

Workflow Get-VMReplicaStatus
{
    param(
    [Paramater(mandatory=$true)]
    $VMHost,
    [Paramater(mandatory=$true)]
    $VMName
    )
    InlineScript
    {
        Get-VMReplication $USING:VMName
    } -PSComputerName $VMHost
}
Written on July 30, 2014