Functions/Get-IniContent.ps1
Set-StrictMode -Version Latest Function Get-IniContent { <# .Synopsis Gets the content of an INI file .Description Gets the content of an INI file and returns it as a hashtable .Notes Author : Oliver Lipkau <oliver@lipkau.net> Source : https://github.com/lipkau/PsIni http://gallery.technet.microsoft.com/scriptcenter/ea40c1ef-c856-434b-b8fb-ebd7a76e8d91 Version : 1.0.0 - 2010/03/12 - OL - Initial release 1.0.1 - 2014/12/11 - OL - Typo (Thx SLDR) Typo (Thx Dave Stiff) 1.0.2 - 2015/06/06 - OL - Improvment to switch (Thx Tallandtree) 1.0.3 - 2015/06/18 - OL - Migrate to semantic versioning (GitHub issue#4) 1.0.4 - 2015/06/18 - OL - Remove check for .ini extension (GitHub Issue#6) 1.1.0 - 2015/07/14 - CB - Improve round-tripping and be a bit more liberal (GitHub Pull #7) OL - Small Improvments and cleanup 1.1.1 - 2015/07/14 - CB - changed .outputs section to be OrderedDictionary 1.1.2 - 2016/08/18 - SS - Add some more verbose outputs as the ini is parsed, allow non-existent paths for new ini handling, test for variable existence using local scope, added additional debug output. #Requires -Version 2.0 .Inputs System.String .Outputs System.Collections.Specialized.OrderedDictionary .Parameter FilePath Specifies the path to the input file. .Parameter CommentChar Specify what characters should be describe a comment. Lines starting with the characters provided will be rendered as comments. Default: ";" .Parameter IgnoreComments Remove lines determined to be comments from the resulting dictionary. .Example $FileContent = Get-IniContent "C:\myinifile.ini" ----------- Description Saves the content of the c:\myinifile.ini in a hashtable called $FileContent .Example $inifilepath | $FileContent = Get-IniContent ----------- Description Gets the content of the ini file passed through the pipe into a hashtable called $FileContent .Example C:\PS>$FileContent = Get-IniContent "c:\settings.ini" C:\PS>$FileContent["Section"]["Key"] ----------- Description Returns the key "Key" of the section "Section" from the C:\settings.ini file .Link Out-IniFile #> [CmdletBinding()] [OutputType( [System.Collections.Specialized.OrderedDictionary] )] Param( [ValidateNotNullOrEmpty()] [Parameter(ValueFromPipeline=$True,Mandatory=$True)] [string]$FilePath, [char[]]$CommentChar = @(";"), [switch]$IgnoreComments ) Begin { Write-Debug "PsBoundParameters:" $PSBoundParameters.GetEnumerator() | ForEach { Write-Debug $_ } if ($PSBoundParameters['Debug']) { $DebugPreference = 'Continue' } Write-Debug "DebugPreference: $DebugPreference" Write-Verbose "$($MyInvocation.MyCommand.Name):: Function started" $commentRegex = "^([$($CommentChar -join '')].*)$" Write-Debug ("commentRegex is {0}." -f $commentRegex) } Process { Write-Verbose "$($MyInvocation.MyCommand.Name):: Processing file: $Filepath" $ini = New-Object System.Collections.Specialized.OrderedDictionary([System.StringComparer]::OrdinalIgnoreCase) if (!(Test-Path $Filepath)) { Write-Verbose ("Warning: `"{0}`" was not found." -f $Filepath) return $ini } $commentCount = 0 switch -regex -file $FilePath { "^\s*\[(.+)\]\s*$" # Section { $section = $matches[1] Write-Verbose "$($MyInvocation.MyCommand.Name):: Adding section : $section" $ini[$section] = New-Object System.Collections.Specialized.OrderedDictionary([System.StringComparer]::OrdinalIgnoreCase) $CommentCount = 0 continue } $commentRegex # Comment { if (!$IgnoreComments) { if (!(test-path "variable:local:section")) { $section = $script:NoSection $ini[$section] = New-Object System.Collections.Specialized.OrderedDictionary([System.StringComparer]::OrdinalIgnoreCase) } $value = $matches[1] $CommentCount++ Write-Debug ("Incremented CommentCount is now {0}." -f $CommentCount) $name = "Comment" + $CommentCount Write-Verbose "$($MyInvocation.MyCommand.Name):: Adding $name with value: $value" $ini[$section][$name] = $value } else { Write-Debug ("Ignoring comment {0}." -f $matches[1]) } continue } "(.+?)\s*=\s*(.*)" # Key { if (!(test-path "variable:local:section")) { $section = $script:NoSection $ini[$section] = New-Object System.Collections.Specialized.OrderedDictionary([System.StringComparer]::OrdinalIgnoreCase) } $name,$value = $matches[1..2] Write-Verbose "$($MyInvocation.MyCommand.Name):: Adding key $name with value: $value" $ini[$section][$name] = $value continue } } Write-Verbose "$($MyInvocation.MyCommand.Name):: Finished Processing file: $FilePath" Return $ini } End {Write-Verbose "$($MyInvocation.MyCommand.Name):: Function ended"} } Set-Alias gic Get-IniContent |