我怀疑这是一些我不完全理解的隐含/明确的问题。我的很多脚本都涉及从服务器获取信息,用数据填充变量以及将变量写入CSV文件。为此,我重新使用了一个名为Write-CSV的函数:
function Write-CSV {
$NewLine = "{0},{1},{2} -f $Server,$Data1,$Data2
$NewLine | Add-Content -Path $CSV
}
它似乎运行良好,除非我的服务器列表中的一个服务器处于脱机状态。我报告的事件是这样的:
$Data1 = "Offline"; $Data2 = $Null; Write-CSV
为下一个服务器的结果保留$Data1
值时发生了什么。因此,我的列表中的服务器#5处于脱机状态。 CSV文件最终会如下所示:
Server Data1 Data2
...
server4 datapoint1 datapoint2
server5 Offline
server6 Offline datapoint2
server7 Offline datapoint2
为防止这种情况,我将以下行添加到Write-CSV函数的 end 中:
clv Data1,Data2 -ErrorAction SilentlyContinue
CLV
是Clear-Variable
的别名。我的想法是,当下一个服务器被解决时,所有变量都将被清除。但$Data1
列仍会显示列表的其余部分的离线。
我测试了在ISE中分别调用每一行的函数,并且clv正常工作。但是在脚本中它失败了。我最终将clv行添加到foreach ($server in $serverlist)
循环的末尾 - 这意味着它在函数外部操作。但是如果可能的话,我宁愿将它作为未来脚本函数本身的一部分。
提前致谢。
答案 0 :(得分:2)
我认为您应该只为您的函数使用参数,然后您不必担心您遇到的这个范围问题。
对于变量$Data1
和$Data2
,可以安全地假设它们在另一个范围内声明。使用Clear-Variable
s -Scope
参数可能就是您需要做的。
Clear-Variable Data1,Data2 -Scope 1 -ErrorAction SilentlyContinue
1
是对父范围的引用。如果那不是声明变量的地方,你也可以使用" Global"。有关详细信息,请参阅TechNet