echo in while循环get添加到我的返回值

时间:2015-04-08 03:25:34

标签: powershell while-loop return write-host

我不确定如何在标题中描述这个问题,所以这里有。 我从另一个脚本中的脚本调用函数。在该函数中,我有一个while循环,它基本上循环通过一组ip并查找它们的主机名。当while循环超时或我们拥有所有主机名时。 它返回主机名。

我的问题是返回值包含我在该函数中执行的每个Write-Host。

我知道这是因为Write-Host将东西放在管道上,返回只返回它拥有的东西。

我如何解决这个问题? 我运行的整个脚本都记录在一个日志文件中,这就是为什么我想要一些详细的日志记录。

|写主机上的out-null修复了该问题,但它没有在脚本中打印写主机值。

在main.psm1中我有一个像这样的函数:

$nodes = @("ip1", "ip2", "ip3", "ip4")
$nodesnames = DoStuff -nodes $nodes

然后在functions.psm1中我有如下函数:

Function DoStuff
{
    param($nodes)
    $timeout = 300
    $timetaken = 0


    $sleepseconds = 5
    $nodenames = @("$env:COMPUTERNAME")

    while(($nodenames.count -lt $nodes.count) -and ($timetaken -lt $timeout))
    {
        try 
        {
            Write-Host "Stuff"
            foreach($node in $nodes)
            {
                $nodename = SuperawesomeFunction $node
                Write-Host "$nodename"
                if($nodenames -notcontains $nodename)
                {
                    $nodenames += @($nodename)
                }
            }
        }
        catch
        {
            Write-Host "DoStuff Failed because $_"
        }
        Start-Sleep $sleepseconds
        $timetaken += $sleepseconds
    }
    return $nodenames
}

Function SuperawesomeFunction 
{
    param($node)
    $nodename = [System.Net.Dns]::GetHostEntry("$node")
    return $nodename
}

感谢。

1 个答案:

答案 0 :(得分:3)

所以答案是,你的功能就像它的设计一样。在PowerShell中,函数通常会将输出返回到管道,除非另有特别说明。

您之前使用过Echo,这是Write-Output的别名,输出是按照我之前提到的那样传递给管道的。因此,它将与return ed $nodenames数组一起收集。

Echo替换Write-Host会更改所有内容,因为Write-Host明确告诉PowerShell将信息发送到主机应用程序(通常是PowerShell控制台或PowerShell ISE)。

你怎么避免这个?您可以添加一个指定日志文件路径的参数,并让您的函数直接更新日志文件,并仅输出相关数据。

或者,您可以创建一个具有一对属性的对象,这些属性将传递回管道,该管道的DNS结果在一个属性中,而错误在另一个属性中。

您可以在函数中使用Write-Error,并将其设置为高级函数以支持-errorvariable并在单独的变量中捕获错误。说实话,我不知道该怎么做,我从来没有这样做,但我90%确定可以做到。