2017-03-14 52 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