在PowerShell中调用动态变量

Tim*_*moY 5 powershell indirection dynamic-variables

我正在尝试创建一个新变量,它将使用动态名称的其他变量作为其值.这是我想要做的:

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

$Years = 2015, 2016
Run Code Online (Sandbox Code Playgroud)

另一个变量$ Transactions包含各种事务的列表.

我试图通过以下方式使用每个$ Years值:

ForEach($Year in $Years){

New-Variable -Name "Transactions_$Year" -Value $Transactions | Where {$_.Date -like "*.$Year"
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

这可能吗,或者您有什么其他方法可以实现这一目标吗?

Joe*_*oey 6

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

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

如果您绝对必须使用此方法,那么您可以通过Get-Variable以下方式再次获取变量:

Get-Variable Transactions_$Year | % Value
Run Code Online (Sandbox Code Playgroud)

但是,具有魔术名称的多个变量是解决此问题的一种相当差的方法.你可能更想要一张地图:

$TransactionsPerYear = @{}
$Years | ForEach-Object {
  $TransactionsPerYear[$_] = $Transactions | Where Date -like "*.$_"
}
Run Code Online (Sandbox Code Playgroud)

你可以获得2015年的所有交易$TransactionsPerYear[2015].

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

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

(这是对它如何工作的猜测.看起来你的日期字符串包含一段时间,之后有一年,没有别的,所以也许像dd.MM.yyyy日期格式.