2017-03-14 32 views
3

我想创建一个新的变量,将使用其他变量与动态名称作为它的值。这里就是我想要做的事:PowerShell中调用动态变量

我有两个值的System.Array:

$Years = 2015, 2016 

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

我试图使用各个$年值的方式如下:

ForEach($Year in $Years){ 

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

现在我想这样做(即相同的foreach循环中)什么是使用$ Transactions_ $新年当我创造价值一个又一个新的变量,就像这样:

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

} 

这是可能的,或者你有任何的替代方法,我怎么能做到这一点?

回答

3

首先,你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日期格式。

+0

$ TransactionsPerYear = @ {} $ 年份| ForEach-Object {Transactions = $ TransactionPerYear [$ _] = $ Transactions |如果日期类似'*。$ _' } 我没有得到任何东西,它没有创建变量$ TransactionsPerYear [2015]或$ TransactionsPerYear [2016]。 我也没有真正理解我如何在第二阶段使用它,我想从每年的收入中获得单独的变量。 – TimoY

+0

这些都不是变数,只是供参考。你只是通过以不同名称来称呼事情而使事情更加混乱。无论如何,我忘记在第二个例子中使用双引号,为什么它不起作用。它现在应该工作。 (或者只是把引号留在那个位置。) – Joey

-1

你想用调用,表达 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}   
+1

我想说,添加'Invoke-Expression'就是在这里增加了另一个非常有问题的元素。不要这样做。 'New-Variable'是创建变量的完美方式,不会产生令人头痛的问题,因为需要正确转义东西以用于“Invoke-Expression”。 – Joey

+0

通过使用Invoke-Expression,您可以完成复杂且灵活的动态变量和值。没有看到这样做的坏事。另一种实现目标的方式。 –

+0

我还没有看到高尔夫以外的实例,其中“Invoke-Expression”实际上是_helping_,而不是让它们变得更加复杂,并引入更多的失败模式。只要看看clusterfuck就是那些试图调用本地命令的人,他们最终以“Invoke-Expression”结尾,没有任何理由,然后在这里提问。 – Joey