PowerShell方法二次调用异常:虚拟信息不显示及返回值异常
PowerShell函数问题解答:虚拟信息显示异常与返回值前缀问题
问题1:虚拟信息无法二次显示
原因
- 函数中
Add-Content使用了-PassThru参数,该参数会将写入文件的内容作为输出返回;同时函数开头的"calling"是直接输出的字符串,这些内容都会被PowerShell纳入函数的返回值集合。 - 第一次调用函数后,返回值被赋值给
$ExistedIps,最后一行$ExistedIps将所有返回内容打印到控制台,因此能看到虚拟信息;第二次调用的返回值存入$ExistedIps2但未执行输出操作,所以控制台看不到第二次的虚拟信息。 - 实际上文件中会追加写入第二次的虚拟信息,只是控制台未输出。
解决方法
- 若需要控制台显示每次调用的虚拟信息,在第二次调用后添加
$ExistedIps2输出语句;或者修改函数,将不必要的输出从返回值中剥离:- 把
"calling"改为Write-Host "calling",Write-Host的输出仅打印到控制台,不会进入返回值集合; - 移除
Add-Content的-PassThru参数,该参数仅在需要捕获写入内容时使用,这里只需写入文件,无需返回。
- 把
问题2:ExistedIps开头出现System.Object等无效前缀
原因
PowerShell函数的返回值是所有未被捕获的输出的集合,而非仅return语句指定的内容。你的函数中存在三类输出:
- 开头的
"calling"字符串,直接进入返回集合; Add-Content -PassThru返回的文件操作对象(如System.IO.FileInfo),也会进入返回集合;return $existed_Ips的IP数组,是你需要的有效内容。
当使用这个混合了不同类型对象的数组时,非字符串类型的对象会调用默认的ToString()方法,输出类型名(如System.Object),从而出现无效前缀。
解决方法
修改函数,确保仅返回IP数组:
- 将
"calling"替换为Write-Host "calling"; - 移除
Add-Content的-PassThru参数; - 优化IP提取逻辑(
$temp.PSObject.Properties.Name无需额外ForEach-Object,直接赋值即可)。
修改后的完整函数代码:
Function ShowVirtualDetails($Virtual, $OutputPath) { Write-Host "calling" $Result = @" {"VirtualMembersStatus":[{"VirtualName":"xxx_T01","AllowableVlans":null,"LoadBalanceMethod":null,"Pools":["xxx_sg_test01"],"Members":{"10.244.61.156:53":"ENABLED","10.244.61.186:53":"ENABLED"},"MonitorName":null,"Policies":null,"SnatPoolName":null,"VirtualEndPoint":"10.20.4.187:53","VirtualType":null,"Profiles":null,"Protocol":null}],"ANPError":{"ID":"eb888cfc-d685-4ae7-a778-fe0cc4cc88a1","CorrelationID":"8157f735-f807-4a36-a112-8a01ec4ee837","Code":{"Vyalue":"HWP1"},"Name":"NoFault","Arguments":["Unknown"],"Message":"Unknown","Description":"\"No Fault\"","RoutingGuide":{"RoutingAction":0,"OwningTeam":null,"RoutingId":null,"Retriable":false}},"QueriedInstance":"PN1PPFCF7DD500C","Succeeded":true,"Errors":{"TerminatingFaultCode":"NoFault","TerminatingFaultMessage":null,"Capacity":4,"Count":1},"EventGuid":"xxxxx","BaseReturnValue":null} "@ $Data = $Result | ConvertFrom-Json $existed_Ips = @() if ($Data.VirtualMembersStatus -ne $null) { $temp = $Data.VirtualMembersStatus.Members $res = $Data.VirtualMembersStatus | ConvertTo-Json -Depth 100 Add-Content -Path $OutputPath -Value "`t`t$Virtual Details" Add-Content -Path $OutputPath -Value "-------------------------------------------------------------------------------------------------------" Add-Content -Path $OutputPath -Value $res $existed_Ips = $temp.PSObject.Properties.Name } else { Write-Host "Activity ID:" $Result.ActivityId -ForegroundColor Red } return $existed_Ips } $OutputPath = ".\Logs\output.txt" New-Item -Path $OutputPath -ItemType File -Force | Out-Null $Script:ExistedIps = ShowVirtualDetails "v1" $OutputPath $Script:ExistedIps2 = ShowVirtualDetails "v3" $OutputPath $ExistedIps $ExistedIps2 # 取消注释可显示第二次调用的结果
内容的提问来源于stack exchange,提问作者Sravani
相关产品推荐
相关产品推荐

