0

I am trying to pull data from a .ini file using the PSIni (Get-IniContent). I have a format that works but generates too much data. My ini file looks like this :

[General settings]
gensetting1=random
gensetting2=random
gensetting3=random

[KPROD]
setting1=1
setting2=2
setting3=3
setting4=4

[KTEST]
setting1=1
setting2=2
setting3=3
setting4=4

[KDEV]
setting1=1
setting2=2
setting3=55
setting4=4

I would like to exclude anything from [General settings] from being populated in my output. As they show up blank because I do not need to gather that information as I specify in my code below. The only data I care to see is [KPROD] keys and values, but if the values are different in [KDEV] and [KTEST] I would like to display the values that do not match. Here is my current code:

Import-Module psini
$ini = Get-IniContent "D:\PShell\SF\871753.ini"
Foreach ($key in $ini.keys) {
    Write-Host $key ;

    Write-Host "Settings1 and Settings2 are set to:"
    ($ini[$key].GetEnumerator() | 
        Where-Object { $_.key -like "Setting1" -or $_.key -like "Setting2" } | 
            Format-Table -HideTableHeaders | Out-String).trim();

    Write-Host "Setting3 is set to: " ;
    ($ini[$key].GetEnumerator() | 
        Where-Object { $_.key -like "Setting3" } | 
            Format-Table -HideTableHeaders | Out-String).trim();

    Write-Host "Setting4 is set to:" ;
    ($ini[$key].GetEnumerator() | 
        Where-Object { $_.key -like "Setting4" } | 
            Format-Table -HideTableHeaders | Out-String).trim();
    Write-host "" 
}
Read-Host -Prompt "Press Enter to exit"

The results displayed are as shown here as you can see with a .ini file with 6 keys and 20 keys within, this list gets very long.

General settings
Settings1 and Settings2 are set to:

Setting3 is set to:  

Setting4 is set to:


KPROD
Settings1 and Settings2 are set to:
setting1                       1
setting2                       2
Setting3 is set to: 
setting3                       3
Setting4 is set to:
setting4                       4

KTEST
Settings1 and Settings2 are set to:
setting1                       1
setting2                       2
Setting3 is set to: 
setting3                       3
Setting4 is set to:
setting4                       4

KDEV
Settings1 and Settings2 are set to:
setting1                       1
setting2                       2
Setting3 is set to: 
setting3                       55
Setting4 is set to:
setting4                       4

Press Enter to exit: 

Is it even possible to achieve my goal? I would love for it to just look like...

KPROD
Settings1 and Settings2 are set to:
setting1                       1
setting2                       2
Setting3 is set to: 
setting3                       3
Setting4 is set to:
setting4                       4

KMDEV
Setting3 is set to: 
setting3                       55
JosefZ
  • 1,514
  • 1
  • 10
  • 18

1 Answers1

0
Import-Module PSIni
$Ini = Get-IniContent 'Example.ini'

#List the name and value of all the KPROD keys
Write-Host "`nKPROD Settings"
$Ini['KPROD'].Keys | ForEach-Object { "$_ is set to $($Ini['KPROD'].$_)" 
}

#Use a ForEach loop so we don't have to duplicate code to check the two 
other sections
ForEach ($Section in 'KTEST','KDEV') {
    Write-Host "`n$Section Settings"

    $Ini[$Section].Keys | ForEach-Object {
        #Uses a ForEach-Object loop to check through all of the Keys in 
the current section and compare them to the same named key in the KPROD 
section, outputting them if they differ   
        If ($Ini[$Section].$_ -ne $Ini['KPROD'].$_) { "$_  is set to 
$($Ini[$Section].$_)" }
    }
}