如何枚举所有本地声明的脚本变量?

时间:2016-12-12 19:22:06

标签: powershell powershell-v4.0

有没有办法在powershell脚本中获取本地声明的变量?

在此snippit中,我希望它仅返回myVar1myVar2anotherVar

$myVar1 = "myVar1"
$myVar2 = "myVar2"
$anotherVar = "anotherVar"
Get-Variable -Scope Script 

但它会返回大量其他本地脚本变量。

我正在尝试解决的问题,也许你可以提出另一种方法,就是我有许多Powershell脚本,它们在顶部声明了一堆misc变量常量。

我想将它们全部导出到磁盘(xml)以便稍后导入。

因此,要调用Get-Variable bla* | Export-Clixml vars.xml,我需要知道所有变量名称。

有没有我喜欢的方式

$allVars = {
    $myVar1 = "alex"
    $myVar2 = "iscool"
    $anotherVar = "thisisanotherVar"
}
Get-Variable allVars | Export-Clixml "C:\TEMP\AllVars.xml"

然后是Import-Clixml .\AllVars.xml | %{ Set-Variable $_.Name $_.Value }

所以脚本的其余部分仍然可以使用$myVar1等,而不会对已编写的内容进行重大更改?

1 个答案:

答案 0 :(得分:2)

问题是,除了您已声明的变量之外,还有更多可在该范围内访问的变量。您可以做的一件事是在之前获取变量列表。获取所有变量的另一个副本,并比较列表以获取您的变量。

$before = Get-Variable -Scope Local
$r = "Stuff"
$after =  Get-Variable -Scope Local

# Get the differences
Compare-Object -Reference $current -Difference $more -Property Name -PassThru

上面应该为您的变量吐出名称和简单值。如果需要,您应该能够轻松地将其发送到Export-CliXML。如果变量很复杂,则可能需要更改-depth以获取更复杂的对象。

警告:如果您要更改一些默认变量值,上面的代码当前会省略它们,因为它只是在寻找新名称。

也不确定是否可以使用与导出时相同的方式导入它们。这在很大程度上取决于您的数据类型。对于简单的变量,这很好

  

我需要知道所有变量名称。

我所知道的唯一其他方式(我从未真正考虑过这一点)是将所有变量更改为具有my_之类的前缀,这样您就可以只有一行用于导出。

Get-Variable my_* | Export-Clixml vars.xml