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

Powershell 如何枚举所有本地声明的脚本变量?,powershell,powershell-4.0,Powershell,Powershell 4.0,有没有办法只获取powershell脚本中本地声明的变量 在这个snipbit中,我希望它只返回myVar1,myVar2,anotherVar: $myVar1 = "myVar1" $myVar2 = "myVar2" $anotherVar = "anotherVar" Get-Variable -Scope Script 但它会返回大量其他本地脚本变量 我试图解决的问题,也许你可以建议另一种方法,是我有许多Powershell脚本,它们在顶部声明了一堆misc变量常量 我想将它们全部

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

在这个snipbit中,我希望它只返回
myVar1
myVar2
anotherVar

$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$u.Name$u.Value}


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

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

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

# Get the differences
Compare-Object -Reference $current -Difference $more -Property Name -PassThru
上面应该给出变量的名称和简单值。如果需要,您应该能够轻松地将其发送到管道中以导出CliXML。如果变量复杂,可能需要更改更复杂对象的
-深度

警告:如果您正在更改一些默认变量值,上述代码当前将忽略它们,因为它只是在寻找新名称

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

我需要知道所有的变量名

我所知道的唯一其他方法(我从未真正考虑过这一点)是将所有变量都更改为具有前缀,如
my\uu
,这样您就可以只导出一行

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

ls变量:
应该可以吗?它会得到我不想加载的各种其他变量,例如
PWD
。如果脚本不互相调用,您不需要在
之前录制
$before
,您只需将
-Scope 0
-Scope 1
进行比较即可。当然,这也有它自己的问题,因为它也会捕获修改过的变量(即使它们没有被任何用户脚本声明)。有没有比XML变量方法更好的方法来存储大量常量以供重用?例如,我有一个名为
RefreshEnvironment
的脚本,我们有
Test1
Test2
服务器,其中脚本的“功能”是相同的,但是
Test1
有不同的服务器名称,与
Test2
@AlexKwitny XML是处理复杂变量和对象的更好方法。它更能识别类型。否则您可以使用CSV文件,但这只适用于字符串和数字。@AlexKwitny:我碰巧需要在脚本中找到解决方案。我决定使用从模块导出的一个全局变量(哈希表)来包含其余(相当多的)配置数据。此哈希仅包含简单值和其他嵌套哈希。当然,只要比引用上下文更合适,我仍然会在cmdlet中使用参数,但对所有内容使用不断重复的参数很快就会过时,即使是使用splatting也是如此。@AlexKwitny:差不多了。如果您的键或值需要转义,那么将字符串转储到散列中要痛苦得多——我不知道为什么没有内置的cmdlet,因为这意味着PowerShell缺少简单的序列化格式(只要您不想查看内部,
ConvertTo/ConvertFrom Json
不要往返,CliXml就可以工作)。无论如何,我编写这样一个函数是为了调试,您也可以在线查找尝试,但我的场景最初只是为了方便地从文件导入这些值,并从命令行更改它们,而不是将它们保存回去。