2017-03-14 8 views
3

動的値を値として持つ他の変数を使用する新しい変数を作成しようとしています。ここで私が何をしようとしていますものです:PowerShellで動的変数を呼び出す

私は2つの値でのSystem.Arrayを持っている:

$Years = 2015, 2016 

別の変数$取引様々なトランザクションのリストを持っています。

私は次のようにこれらの$年の各値を使用しようとしています:今、私は(同じのForEach-ループ内で)やりたいものを

ForEach($Year in $Years){ 

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

$ Transactions_ $イヤーということを使用することですこのような別の新しい変数を作成しているときの値:

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

} 

これは可能ですか、これを実現する方法はありますか?すべての

答えて

3

まず、あなたのNew-Variable呼び出しではなく、変数の値として$Transactions | Where ...の値を使用してのWhere-Objectにパイプしたいあなたと、あなたはそれがない何を考えてNew-Variableの出力を行いません。あなたは仕事にそのための括弧が必要です

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 { $ TransactionsPerYear [$ _] = $トランザクション|どこに日付のような '*。$ _' } 私はこれで何も得られなかった、変数$ TransactionsPerYear [2015]または$ TransactionsPerYear [2016]を作成しません。 私は、これを第2段階でどのように使うことができるのか、実際には分かりませんでした。そこでは、毎年の収入を別々の変数に収めたいと思っています。 – TimoY

+0

これらは変数ではなく、FYIです。異なる名前で物事を呼び出すことによって、物事をより混乱させるだけです。いずれにしても、二重引用符を使用することを忘れてしまった。今はうまくいくはずです。 (あるいは、その時点で引用符を残しておいてください) – Joey

-1

をあなたは起動-式コマンドレットを使用します。動的な文字列expreを作成する必要がありますその値で変数を初期化するコマンドの一部です。ここではあなたがそれを行う方法は次のとおりです。

$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'が実際にはより複雑なものにするのではなく、より多くの失敗モードを導入するのではなく、ゴルフ以外のインスタンスをまだ見ていません。正式な理由がないのに、最終的に 'Invoke-Expression'で終わるネイティブコマンドを呼び出そうとしている人々であるclusterfuckを見て、ここで質問してください。 – Joey

関連する問題