Clear-Variable在函数中不起作用

时间:2015-06-08 15:53:53

标签: function powershell csv

我怀疑这是一些我不完全理解的隐含/明确的问题。我的很多脚本都涉及从服务器获取信息,用数据填充变量以及将变量写入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

CLVClear-Variable的别名。我的想法是,当下一个服务器被解决时,所有变量都将被清除。但$Data1列仍会显示列表的其余部分的离线。

我测试了在ISE中分别调用每一行的函数,并且clv正常工作。但是在脚本中它失败了。我最终将clv行添加到foreach ($server in $serverlist)循环的末尾 - 这意味着它在函数外部操作。但是如果可能的话,我宁愿将它作为未来脚本函数本身的一部分。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为您应该只为您的函数使用参数,然后您不必担心您遇到的这个范围问题。

对于变量$Data1$Data2,可以安全地假设它们在另一个范围内声明。使用Clear-Variable s -Scope参数可能就是您需要做的。

Clear-Variable Data1,Data2 -Scope 1 -ErrorAction SilentlyContinue

1是对父范围的引用。如果那不是声明变量的地方,你也可以使用" Global"。有关详细信息,请参阅TechNet