0

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

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

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

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

| write-host 上的 out-null 修复了该问题,但它不会在脚本中打印 write-host 值。

在 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
}

谢谢。

4

1 回答 1

3

所以答案是,你的功能就像设计一样工作。在 PowerShell 中,除非另有明确指示,否则函数通常会将输出返回到管道。

您之前使用Echo过,它是 的别名Write-Output,并且输出通过管道传递,正如我之前提到的。因此,它将与returned$nodenames数组一起收集。

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

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

或者,您可以创建一个具有一对属性的对象,这些属性通过管道传回,其中 DNS 导致一个属性,而错误在另一个属性中。

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

于 2015-04-08T04:42:34.547 回答