Эхо в то время как цикл get добавлен к моему возвращаемому значению

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

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

я знаю, что это потому, что Write-Host помещает вещи в конвейер, а возврат просто возвращает все, что у него есть.

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

| out-null на write-host устраняет проблему, но не выводит значения 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
}

Благодарю.

1 ответ

Решение

Ответ таков: ваша функция работает так, как задумано. В PowerShell функция будет возвращать вывод в целом в конвейер, если специально не указано иное.

Ты использовал Echo до, который является псевдонимом Write-Outputи вывод передается по каналу, как я уже упоминал ранее. Как таковой он будет собираться вместе с returnиздание $nodenames массив.

Замена Echo с Write-Host меняет все, потому что Write-Host в частности, указывает PowerShell отправлять информацию в хост-приложение (обычно PowerShell Console или PowerShell ISE).

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

Или вы можете создать объект с парой свойств, который передается обратно по каналу, в котором DNS приводит к одному свойству, а ошибки - к другому.

Вы можете использовать Write-Error в функции и установить ее как расширенную функцию для поддержки -errorvariable и записи ошибок в отдельную переменную. Если честно, я не уверен, как это сделать, я никогда этого не делал, но я на 90% уверен, что это можно сделать.

Другие вопросы по тегам