如何在PowerShell中仅列出用户创建的变量?

时间:2013-08-24 13:32:23

标签: powershell scripting

是否可以在PowerShell中轻松列出用户创建的变量? get-variable Cmdlet给了我所有系统变量,这有时不是我想要的。

例如,如果我打开一个新会话并执行

$a=1
$b=2

我希望get-variable的某些变体只返回ab,因为它们是在会话中明确创建的唯一两个变量。

3 个答案:

答案 0 :(得分:12)

大多数标准变量都可以在System.Management.Automation.SpecialVariables中找到。如果过滤掉这些以及其他已知变量的一小部分,则可以创建可重用的函数来获取用户定义的变量:

function Get-UDVariable {
  get-variable | where-object {(@(
    "FormatEnumerationLimit",
    "MaximumAliasCount",
    "MaximumDriveCount",
    "MaximumErrorCount",
    "MaximumFunctionCount",
    "MaximumVariableCount",
    "PGHome",
    "PGSE",
    "PGUICulture",
    "PGVersionTable",
    "PROFILE",
    "PSSessionOption"
    ) -notcontains $_.name) -and `
    (([psobject].Assembly.GetType('System.Management.Automation.SpecialVariables').GetFields('NonPublic,Static') | Where-Object FieldType -eq ([string]) | ForEach-Object GetValue $null)) -notcontains $_.name
    }
}

$a = 5
$b = 10
get-udvariable

Name                           Value                                                                                                              
----                           -----                                                                                                              
a                              5     
b                              10

注意:在ISE中还有两个额外的标准变量:$ psISE和$ psUnsupportedConsoleApplications

答案 1 :(得分:4)

您可以考虑使用说明,但在创建变量时需要不同的语法:

New-Variable -Name a -Value 1 -Description MyVars
nv b 2 -des MyVars
Get-Variable | where { $_.Description -eq 'MyVars' }

第二种语法使用别名/位置参数来缩短你的工作。

答案 2 :(得分:1)

我个人认为这样做的唯一方法是需要额外的步骤将变量存储在数组中。

一个例子,仅用于测试:

PS C:\Users\Athomsfere> $myVars = @($a, $b)
PS C:\Users\Athomsfere> Get-Variable -Name myVars

Name                           Value
----                           -----
myVars                         {some, thing}