Bandit
Bandit

Reputation: 523

Powershell manage set of variables

It should be ok to add all the variables as global inside the function? All the other functions will receive them? I did a short test and it should work. Should I need to add Get-Variable -ValueOnly...?

$ReleaseVersion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).ReleaseVersion
$Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion
$LinkForVersion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).LinkForVersion
$VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber
$buildver = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildver
$PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID
$xmlFilePath = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).xmlFilePath
$ReleaseBuildVer = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).ReleaseBuildVer

Set-Variable -Name "ReleaseVersion" -Value $ReleaseVersion -Scope global
Set-Variable -Name "Sourceversion" -Value $Sourceversion -Scope global
Set-Variable -Name "LinkForVersion" -Value $LinkForVersion -Scope global
Set-Variable -Name "VersionNumber" -Value $VersionNumber -Scope global
Set-Variable -Name "buildver" -Value $buildver -Scope global
Set-Variable -Name "PipelineID" -Value $PipelineID -Scope global
Set-Variable -Name "xmlFilePath" -Value $xmlFilePath -Scope global
Set-Variable -Name "ReleaseBuildVer" -Value $ReleaseBuildVer -Scope global

}

I have a script that read from excel collect files according to a column, Before the running I need to define 4 variables, the issue is that I need to run it for several versions. That means that for each run I need to leave active 4 variables and the rest should be in comment (#) and I do it manually (need to add 12 times # There is a smart way to choose all the 4 variables per version?

I will give an example:

enter image description here

Each time only one set is enabled (According to version I want to work on)

The using of those parameters are:

Add-VSTeamWorkItem -ProjectName "Client-Server" -Title "[Side VIP] [$VersionNumber]"

$Versionlocationforpatches = "$Sourceversion\Installer\Patches" 
$Versionlocationforcabs = "$Sourceversion\Installer" 

Add-VSTeamBuild -ProjectName "Client-Server" -BuildDefinitionId $PipelineID

function RenameVerFile ([string] $buildver) 
{
    $DefaultFile = Get-ChildItem $Sourceversion | Where-Object {$_.Name -like "BuildVer.txt"}
    Clear-Content $DefaultFile.FullName -Force 
    $Newcontent = Add-Content $DefaultFile.FullName -Value ($buildver + "." + (Get-Random)) 
    
}

Some of them are using in other places

Now I have something like this and I am very happy but I want to display the user a menu like: For version 8.5.34 choose 1, Without insert manually the number

enter image description here

I hope this will do the job

do {$VersionToUse = $Versions.buildver | Out-Gridview -Title "Choose version" -PassThru } while ($Versions.buildver -notcontains $VersionToUse)

Upvotes: 0

Views: 149

Answers (2)

An-dir
An-dir

Reputation: 465

Edit: Totally Changed this answer to include latest information

User of the script will now see versions to select and then enter version number to be used. your four variables are then filled with the relevant data.

$SharedDriveFolderPath= "\\Test\xxx" # This is just for me to test - you have your own data somewhere
$Versions = @()
$Versions += "VersionNumber;Sourceversion;PipelineID;buildvers;"
$Versions += "8.5.34;$SharedDriveFolderPath\Versions\8.5.34.31;18710;8.5.34.31"
$Versions += "8.5.35;$SharedDriveFolderPath\Versions\8.5.34.35;18713;8.5.34.35"
$Versions = $Versions | ConvertFrom-CSV -Del ";"

do {$VersionToUse = ($Versions | Out-GridView -OutputMode Single -Title "Select version to use").VersionNumber} while (-not $VersionToUse)

$VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber
$Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion
$PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID
$buildvers = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildvers

Take this Code to replace your version lines (the ones you posted here as screenshot example)

Alternative as json if you prefer that:

$SharedDriveFolderPath= "\\Test\xxx" # This is just for me to test - you have your own data somewhere
$Versions = @"
[
    {
        "VersionNumber":  "8.5.34",
        "Sourceversion":  "$($SharedDriveFolderPath -replace "\\","\\")\\Versions\\8.5.34.31",
        "PipelineID":  "18710",
        "buildvers":  "8.5.34.31"
    },
    {
        "VersionNumber":  "8.5.35",
        "Sourceversion":  "$($SharedDriveFolderPath -replace "\\","\\")\\Versions\\8.5.34.35",
        "PipelineID":  "18713",
        "buildvers":  "8.5.34.35"
    }
]
"@ | ConvertFrom-Json

do {$VersionToUse = ($Versions | Out-GridView -OutputMode Single -Title "Select version to use").VersionNumber} while (-not $VersionToUse)

$VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber
$Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion
$PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID
$buildvers = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildvers

Replace the line starting with "do" with the following code to get another way of selection if you don't like the gridview

$i = 0; foreach ($Version in $Versions.VersionNumber) {$i++; "[$i] $Version"; }; $VersionToUse = ($Versions[$(do {"Enter ID of Version to use"; $id = Read-Host} while (-not ($id -le $Versions.count -and $id -gt 0));$id - 1)]).VersionNumber

Upvotes: 1

An-dir
An-dir

Reputation: 465

You could store and choose it that way with a hashtable:

$myVars = @{}
$myVars.Version2000 = @{"Path"="c:\";"Title"="MySensitiveData"}
$myVars.Version2000.Path
$myVars.Version2000.Title

it could then look like

PS C:\> $myVars = @{}
PS C:\> $myVars.Version2000 = @{
>> "Path"="c:\Prog2000"
>> "Title"="MySensitiveData"
>> "Var3"="Value3"
>> "Var4"="value4"
>> }
PS C:\> $myVars.Version2013 = @{
>> "Path"="c:\Prog2013"
>> "Title"="MySensitiveData"
>> "Var3"="Value3"
>> "Var4"="value4"
>> }
PS C:\> $myVars.Version2000

Name                           Value
----                           -----
Var4                           value4
Path                           c:\
Var3                           Value3
Title                          MySensitiveData
PS C:\> $myVars.Version2000.Path
c:\

EDIT: Added a new answer as more information came in OP

Upvotes: 0

Related Questions