在 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}
我正在尝试创建一个新变量,该变量将使用其他具有动态名称的变量作为其值。这是我正在尝试做的事情:
我有一个 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]
.
另一种方法是 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}