I am trying to create a new variable that would use other variable with dynamic name as its value. Here\'s what I am trying to do:
I have a System.Array with two val
You want to use Invoke-Expression cmdlet. You need to create dynamic string expression of commands that would initialize variable with the value. Here's how you do it:
$Years = 2015, 2016, 2017, 2018
$Years | ForEach-Object {
$Year = $_
Invoke-Expression ('$Year' + $Year + ' = "Year is ' + $Year + '"')
}
Here's the output:
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}
First of all, your New-Variable
invocation doesn't do what you think it does, as you'd pipe the output of New-Variable
to Where-Object
instead of using the value of $Transactions | Where ...
as value for the variable. You need parentheses for that to work:
New-Variable -Name "Transactions_$Year" -Value ($Transactions | Where {$_.Date -like "*.$Year" })
If you absolutely have to use this approach, then you can get the variables again via Get-Variable
:
Get-Variable Transactions_$Year | % Value
However, multiple variables with magic names is a rather poor way of solving this. You probably rather want a map:
$TransactionsPerYear = @{}
$Years | ForEach-Object {
$TransactionsPerYear[$_] = $Transactions | Where Date -like "*.$_"
}
And you can get all transactions for 2015 with $TransactionsPerYear[2015]
.
Another way is Group-Object
which doesn't even require a list of possible years to begin with, but groups a number of objects by some property or expression result:
$TransactionsPerYear = $Transactions | Group-Object { [int]($_.Date -replace '.*\.') }
(This is a guess on how it could work. It seems like your date string contains something up to a period, after which there is the year and nothing else, so perhaps something like dd.MM.yyyy
date format.