вывод функции powershell в переменную

У меня есть функция в powershell 2.0 с именем getip, которая получает IP-адрес(а) удаленной системы.

function getip {
$strComputer = "computername"

$colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $strComputer -filter "IpEnabled = TRUE"



ForEach ($objItem in $colItems)

{Write-Host $objItem.IpAddress}

}

У меня проблема с получением вывода этой функции в переменную. Следующее не работает...

$ipaddress = (getip)
$ipaddress = getip
set-variable -name ipaddress -value (getip)

любая помощь с этой проблемой будет принята с благодарностью.


person tommy    schedule 10.06.2010    source источник


Ответы (3)


Возможно, это сработает? (Если вы используете Write-Host, данные будут выведены, а не возвращены).

function getip {
    $strComputer = "computername"

    $colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $strComputer -filter "IpEnabled = TRUE"

    ForEach ($objItem in $colItems) {
        $objItem.IpAddress
    }
}


$ipaddress = getip

$ipaddress будет содержать массив строковых IP-адресов.

person Nate Pinchot    schedule 10.06.2010
comment
В частности, Write-Host отправляет данные непосредственно на хост консоли или стандартный вывод процесса. Write-Output или отсутствие захвата вывода (как в примере Нейта) отправит вывод на стандартный вывод текущего конвейера или функции. Это примерно то же самое поведение, что и эхо в пакетном файле. - person JasonMArcher; 14.06.2010

ты тоже можешь сделать

function getip {
    $strComputer = "computername"

    $colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $strComputer -filter "IpEnabled = TRUE"

    ForEach ($objItem in $colItems) {
        write-output $objItem.IpAddress
    }
}


$ipaddress = getip

для доступа к трубопроводу вы должны использовать return/write-output

person OhadH    schedule 13.02.2012

в двух словах проблема в том, что Write-Host нельзя перенаправить.

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

Использовать:

  • Write-Host для записи непосредственно в процесс (shell), а не в поток
  • Write-Output to write to success-/output-stream.
    • redirect only the success-stream to file: Write-Output "success message" 1>output_stream_messages.txt
    • сохранить в переменной: $var=Write-Output "output message"
    • Примечание: назначение переменной всегда и только перенаправляет поток вывода/успешного выполнения. Другие потоки остаются нетронутыми
  • Write-Error to write to the error-stream
    • redirect only the error-stream to file: Write-Error "error message" 2>error_stream_messages.txt
    • сохранить в переменной: $var=Write-Error "Error message" 2>&1
    • Примечание. На самом деле это перенаправляет поток ошибок в поток успеха. Данные, уже находящиеся в потоке успеха, не перезаписываются, а добавляются). Поскольку вывод ошибки теперь находится в потоке успеха (также), мы можем сохранить его в переменной, перенаправив/назначив данные потока успеха в переменную $var.
  • Write-Warningto write to the warning-stream
    • redirect only the warning-stream to file: Write-Warning "warning message" 3>warning_stream_messages.txt
    • сохранить в переменной: $var=Write-Warning "Warning message" 3>&1
  • Write-Verbose to write to the verbose-stream
    • redirect only the verbose-stream to file: Write-Verbose "verbose message" -Verbose 4>verbose_stream_messages.txt
    • сохранить в переменной: $var=Write-Verbose "Verbose message" -Verbose 4>&1
    • Примечание. -Verbose необходимо, поскольку настройка powershell по умолчанию не выводит подробные сообщения. (Как определено привилегированной переменной $VerbosePreference, которая обычно "SilentlyContinue". Вы также можете установить для нее значение $VerbosePreference="Continue" перед вызовом команды (в текущем сеансе/среде powershell), чтобы не нуждаться в переключателе -Verbose .) Посмотрите здесь для получения дополнительной информации о привилегированных переменных powershell.
  • Write-Debugto write to the debug-stream
    • redirect only the debug stream to file: Write-Debug "debug message" -Debug 5>debug_stream_messages.txt
    • сохранить в переменной: $var=Write-Debug "Debug message" -Debug 5>&1
    • Примечание. В зависимости от вашей настройки переменной $DebugPreference ваш powershell может приостановиться и запросить ваш ввод для следующего выбранного действия. Установите $DebugPreference="Continue" как, чтобы избавиться от этого поведения, а также избавиться от необходимости в переключателе -Debug перед вызовом команды.

Вы можете использовать *>&1, чтобы перенаправить все потоки в поток успеха, а затем перенаправить его по своему усмотрению. (Сохранение его в переменной или перенаправление в $null или в файл или что-то в этом роде.)

Для получения более подробной информации я рекомендую очень хорошую статью о потоки powershell на devblogs.microsoft.com

person TheUnseen    schedule 04.09.2019