我不确定如何在标题中描述这个问题,所以这里有。 我从另一个脚本中的脚本调用函数。在该函数中,我有一个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
}
感谢。
答案 0 :(得分:3)
所以答案是,你的功能就像它的设计一样。在PowerShell中,函数通常会将输出返回到管道,除非另有特别说明。
您之前使用过Echo
,这是Write-Output
的别名,输出是按照我之前提到的那样传递给管道的。因此,它将与return
ed $nodenames
数组一起收集。
用Echo
替换Write-Host
会更改所有内容,因为Write-Host
明确告诉PowerShell将信息发送到主机应用程序(通常是PowerShell控制台或PowerShell ISE)。
你怎么避免这个?您可以添加一个指定日志文件路径的参数,并让您的函数直接更新日志文件,并仅输出相关数据。
或者,您可以创建一个具有一对属性的对象,这些属性将传递回管道,该管道的DNS结果在一个属性中,而错误在另一个属性中。
您可以在函数中使用Write-Error,并将其设置为高级函数以支持-errorvariable并在单独的变量中捕获错误。说实话,我不知道该怎么做,我从来没有这样做,但我90%确定可以做到。