powershell函数输出到变量

时间:2010-06-10 18:28:15

标签: powershell powershell-v2.0

我在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)

对此问题的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:6)

这可能有用吗? (如果使用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地址数组。

答案 1 :(得分:2)

你也可以

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

答案 2 :(得分:1)

简而言之,问题是Write-Host 无法被重定向。

您可以利用此行为来发挥自己的优势,例如向用户返回在重定向函数的返回值时不会捕获的信息,将其存储在变量中,但是仍然可见。

使用:

  • Write-Host直接写入(shell)进程-而不是流
  • Write-Output写入成功/输出流
    • 仅将成功流重定向到文件Write-Output "success message" 1>output_stream_messages.txt
    • 存储在变量中:$var=Write-Output "output message"
    • 注意:变量赋值始终且仅会重定向输出/成功流。其他流保持不变
  • Write-Error写入错误流
    • 仅将错误流重定向到文件:Write-Error "error message" 2>error_stream_messages.txt
    • 存储在变量中:$var=Write-Error "Error message" 2>&1
    • 注意:实际上,这会将错误流重定向到成功流成功流中已经存在的数据不会覆盖,而是附加)。由于错误输出现在也位于成功流中,因此我们可以通过重定向/分配成功流数据将其存储在变量中。 em>到变量$var
  • Write-Warning写入警告流
    • 仅将警告流重定向到文件:Write-Warning "warning message" 3>warning_stream_messages.txt
    • 存储在变量中:$var=Write-Warning "Warning message" 3>&1
  • Write-Verbose写入详细流
    • 仅将 verbose-stream 重定向到文件: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。)请查看here,以获取有关 powershell首选项变量的更多信息。
  • Write-Debug写入调试流
    • 仅将调试流重定向到文件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's streams on devblogs.microsoft.com的很好的文章