Эхо в то время как цикл 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% уверен, что это можно сделать.