我在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)
对此问题的任何帮助将不胜感激。
答案 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
$var
。Write-Warning
写入警告流
Write-Warning "warning message" 3>warning_stream_messages.txt
$var=Write-Warning "Warning message" 3>&1
Write-Verbose
写入详细流
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="Continue"
设置为可消除此行为,并且也无需在调用命令之前先使用-Debug
开关。您可以使用*>&1
将所有流重定向到成功流,然后根据需要将其重定向。 (将其存储在变量中或将其重定向到 $ null 或文件或类似文件。)
有关更多详细信息,我推荐一篇有关powershell's streams on devblogs.microsoft.com的很好的文章