functions/Test-WithCulture.ps1
|
function Test-WithCulture { [cmdletbinding(DefaultParameterSetName = 'scriptblock')] param ( [Parameter( Position = 0, Mandatory, HelpMessage = 'Enter a new culture like de-de' )] [ValidateNotNullOrEmpty()] [System.Globalization.CultureInfo]$Culture, [Parameter( Position = 1, ParameterSetName = 'scriptblock', Mandatory, HelpMessage = 'Enter a scriptblock to execute using the specified culture' )] [ValidateNotNullOrEmpty()] [scriptblock]$Scriptblock, [Parameter( ParameterSetName = 'file', Mandatory, HelpMessage = 'Enter the path to a PowerShell script file to execute using the specified culture' )] [ValidateNotNullOrEmpty()] [ValidatePattern('\.ps1$')] [ValidateScript( { if (Test-Path $_ ) { $True } else { throw "Failed to find the file $_." $false } })] [string]$FilePath, [Parameter(HelpMessage = 'Specify an array of positional arguments to pass to the scriptblock for file.')] [object[]]$ArgumentList ) #tags are used for categorizing the command #cmdTags = scripting Write-Verbose "Starting $($MyInvocation.MyCommand)" Write-Verbose "Running under PowerShell version $($PSVersionTable.PSVersion)" Write-Verbose "Testing with culture-language $culture. [$($culture.DisplayName)]" Write-Verbose 'Saving current culture values' #save current culture values $OldCulture = $PSCulture $OldUICulture = $PSUICulture Write-Verbose 'Setting the new culture' [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture [System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture #update PSBoundParameters which will be splatted to Invoke-Command Write-Verbose "Using PowerShell $($PSVersionTable.PSVersion)" Write-Verbose "Current Thread Culture = $([System.Threading.Thread]::CurrentThread.CurrentCulture)" Write-Verbose "Current Thread UICulture = $([System.Threading.Thread]::CurrentThread.CurrentUICulture)" [void]$PSBoundParameters.remove('Culture') [void]$PSBoundParameters.add('ErrorAction', 'stop') try { #run the command if ($PSCmdlet.ParameterSetName -eq 'scriptblock') { Write-Verbose "Testing $scriptblock" } else { Write-Verbose 'Adding computername parameter' $PSBoundParameters.add('ComputerName', 'localhost') Write-Verbose "Invoking file $Filepath" } Invoke-Command @PSBoundParameters } catch { Write-Warning "There was a problem. $($_.exception.message)" } finally { Write-Verbose 'Restoring original settings' #roll culture settings back - erring on the side of caution. [System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture [System.Threading.Thread]::CurrentThread.CurrentUICulture = $OldUICulture } Write-Verbose "Ending $($MyInvocation.MyCommand)" } #end function Register-ArgumentCompleter -CommandName Test-WithCulture -ParameterName Culture -ScriptBlock { param($commandName, $parameterName, $WordToComplete, $commandAst, $fakeBoundParameter) $CultHash = @{ } [System.Globalization.CultureInfo]::GetCultures('AllCulture') | ForEach-Object { $CultHash.add($_.name, $_.DisplayName) } ($CultHash.GetEnumerator()).where( { $_.key -match "^$WordToComplete" }) | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_.name, $_.name, 'ParameterValue', $_.value) } } #EOF |