Modules/EncodingHelpers/M365DSCStringEncoding.psm1
function Format-M365DSCString { [CmdletBinding()] [OutputType([System.Collections.HashTable])] param( [Parameter(Mandatory = $true)] [System.Collections.Hashtable] $Properties, [Parameter(Mandatory = $true)] [System.String] $ResourceName ) $InvalidCharacters = @( @{ # Tilted Apostrophe InvalidCharacter = "[\u2019]" MainReplaceBy = "'" CimReplaceBy = "''" }, @{ # Tilted Left Quotes InvalidCharacter = "[\u201C]" MainReplaceBy = "`"" CimReplaceBy = '"' }, @{ # Tilted Right Quotes InvalidCharacter = "[\u201D]" MainReplaceBy = "`"" CimReplaceBy = '"' } ) $DSCResource = Get-DSCResource -Module 'Microsoft365DSC' ` -Name $ResourceName # For each invalid character, look for an instance in the string, # if an instance is found, $newProperties = @{} foreach ($key in $Properties.Keys) { $newProperties.Add($key, $Properties.$key) if (-not [System.String]::IsNullOrEmpty($newProperties.$key) -and ` $newProperties.$key.GetType().ToString() -eq 'System.String') { # Obtain the type for this property from the module; $foundProperty = $DSCResource.Properties | Where-Object -FilterScript {$_.Name -eq $key} foreach ($entry in $InvalidCharacters) { $found = $newProperties.$key -match $entry.InvalidCharacter while ($found) { if ($foundProperty.PropertyType -eq '[string]') { $newProperties.$key = $newProperties.$key -replace $entry.InvalidCharacter, $entry.MainReplaceBy } elseif ($foundProperty.PropertyType -like '`[MSFT_*`]') { # Case property is a CIMInstance $newProperties.$key = $newProperties.$key -replace $entry.InvalidCharacter, $entry.CimReplaceBy } else { break } $found = $newProperties.$key -match $entry.InvalidCharacter } } } } return $newProperties } |