Добавить к переменной из команды вызова

Мне нужен вывод переменной из Invoke-Command, но при печати он отображается пустым, ниже приведен пример кода:

$ServiceName = "Service"

Invoke-Command -ScriptBlock {

        try {
            iisreset
            $BodyContent += "Server: <b>$server</b> IIS reset completed<br>"

        }
        catch {
            $BodyContent += "Server: <b>$server</b> is Failed to restart IIS<br>"
            $ErrorStat = 1
        }

        try {
            Stop-Service -DisplayName $using:ServiceName
            $BodyContent += "Server: <b>$server</b> is successfully Stopped $using:ServiceName<br>"
        }
        catch {
            $BodyContent += "Server: <b>$server</b> is failed to Stop $using:ServiceName<br>"
            $ErrorStat = 1
        }

        try {
            Start-Service -DisplayName $using:ServiceName
            $BodyContent += "Server: <b>$server</b> is successfully Started $using:ServiceName<br>"
        }
        catch {
            $BodyContent += "Server: <b>$server</b> is failed to Start $using:ServiceName<br>"
            $ErrorStat = 1
        }

    } -ComputerName $server -Credential $user -ErrorAction Stop

Здесь я хочу захватить $BodyContent и $ErrorStat


person San    schedule 19.03.2018    source источник


Ответы (2)


Invoke-Command возвращает вам то, что напечатано до конца конвейера. Если вы хотите вернуть переменную, вы должны Return <variable> например:

$ret = Invoke-Command -ScriptBlock { $var="test string"; return $var; }

где $ret теперь содержит значение test string.

Когда у вас есть несколько переменных, которые вы хотите вернуть, вы можете объединить их в одну переменную, например. нравится:

$str1 = "test"
$str2 = "123"
$combinedObjs = New-Object PSObject -Property @{1 = $str1; 2 = $str2}

Теперь вы можете совместить все это

$ret = Invoke-Command -ScriptBlock { 
  $str1 = "test";
  $str2 = "123";
  $combinedObjs =  @{val1 = $str1; val2 = $str2};
  Return $combinedObjs;
}

теперь $ret содержит

Name                           Value
----                           -----
val1                           test
val2                           123

и вы можете получить к ним доступ, позвонив по номеру $ret.val1 или $ret.val2

person kim    schedule 19.03.2018
comment
Я бы сказал, что то, что выводится на экран, неточно. - person Clijsters; 19.03.2018
comment
Обновил свой текст. Это была плохая формулировка с моей стороны - person kim; 19.03.2018
comment
Идеально! Я предложил отредактировать, но теперь это переопределено вашим, и это нормально. Я бы просто удалил кавычки из встроенных блоков кода, так как они - синтаксически - не являются частью значения, но я буду мелочным;) - person Clijsters; 19.03.2018

Добавьте некоторый вывод в самый конец данного блока сценария, например.

    @{  BodyContent = $BodyContent
        ErrorStat   = $ErrorStat
    }

Если вы используете, например.

$result = Invoke-Command -ScriptBlock { 

    ###  original script block body here

    @{  BodyContent = $BodyContent
        ErrorStat   = $ErrorStat
    }
}  -ComputerName $server -Credential $user -ErrorAction Stop

тогда вы можете проверить

$result.BodyContent
$result.ErrorStat
person JosefZ    schedule 19.03.2018