在 PowerShell 中调用动态变量

Calling dynamic variable in PowerShell

我正在尝试创建一个新变量,该变量将使用其他具有动态名称的变量作为其值。这是我正在尝试做的事情:

我有一个 System.Array 有两个值:

$Years = 2015, 2016

另一个变量,$Transactions 有各种交易的列表。

我正在尝试按以下方式使用每个 $Years 值:

foreach ($Year in $Years){
   New-Variable -Name "Transactions_$Year" -Value $Transactions |
     Where {$_.Date -like "*.$Year"}
}

现在我想做的(在同一个 foreach 循环中)是在我创建另一个新变量时使用那个 $Transactions_$Year 值,如下所示:

New-Variable -Name "Income_$Year" -Value $Transactions_$Year |
  Where {$_.Amount -NotLike "-*"} | 
    Measure-Object Amount -Sum | Select -ExpandProperty Sum

这可能吗,或者您有任何其他方法可以实现吗?

首先,您的 New-Variable 调用并没有按照您的想法执行,因为您将 New-Variable 的输出通过管道传递给 Where-Object 而不是使用值$Transactions | Where ... 作为变量的值。你需要括号才能工作:

New-Variable -Name "Transactions_$Year" -Value ($Transactions | Where {$_.Date -like "*.$Year" })

如果您绝对必须使用这种方法,那么您可以通过 Get-Variable:

再次获取变量
Get-Variable Transactions_$Year | % Value

但是,具有神奇名称的多个变量是解决此问题的一种相当糟糕的方法。您可能更想要一张地图:

$TransactionsPerYear = @{}
$Years | ForEach-Object {
  $TransactionsPerYear[$_] = $Transactions | Where Date -like "*.$_"
}

并且您可以使用 $TransactionsPerYear[2015].

获取 2015 年的所有交易

另一种方法是 Group-Object,它甚至不需要开始的可能年份列表,而是按 属性 或表达式结果对多个对象进行分组:

$TransactionsPerYear = $Transactions | Group-Object { [int]($_.Date -replace '.*\.') }

(这是对它如何工作的猜测。看起来你的日期字符串包含最多一个句点,之后是年份,没有其他内容,所以可能类似于 dd.MM.yyyy 日期格式.

您想使用 Invoke-Expression cmdlet。您需要创建将使用该值初始化变量的命令的动态字符串表达式。操作方法如下:

$Years = 2015, 2016, 2017, 2018
$Years | ForEach-Object { 
    $Year = $_
    Invoke-Expression ('$Year' + $Year + ' = "Year is ' + $Year + '"')
 }

这是输出:

Get-Variable Year*

Name                           Value                                                                                                                                                                                                                             
----                           -----                                                                                                                                                                                                                             
Year                           2018                                                                                                                                                                                                                              
Year2015                       Year is 2015                                                                                                                                                                                                                      
Year2016                       Year is 2016                                                                                                                                                                                                                      
Year2017                       Year is 2017                                                                                                                                                                                                                      
Year2018                       Year is 2018                                                                                                                                                                                                                      
Years                          {2015, 2016, 2017, 2018}