Using-Culture -Culture culture -Script {scriptblock}

One of the traditional challenges with scripting is dealing with different CULTURES. Imagine the case where you are writing a script and you'll have to parse datetime string from different cultures. If it was just one culture, you could set the process culture and be done with it. Here is a function that allows you to run a portion of a script in a different culture:

Function Using-Culture (
[System.Globalization.CultureInfo]$culture = (throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"),
[ScriptBlock]$script= (throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"))
{
$OldCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture
    trap
{
[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture
}
[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
Invoke-Command $script
[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture
}

Here is an example of it working:

[332:]MSH> using-culture ar-IQ {get-date}

30 تشرين الثاني, 2005 09:01:38 ص

[332:]MSH> using-culture ar-IQ {$global:d=[DateTIme]::Parse("30 تشرين الثاني, 2005 09:01:38 ص")}
[332:]MSH> $d

Wednesday, November 30, 2005 9:01:38 AM

[332:]MSH> using-culture de-de {get-date}

Mittwoch, 30. November 2005 09:02:29
[332:]MSH> using-culture de-de {$global:d=[DateTIme]::Parse("Mittwoch, 30. November 2005 09:02:29")}
[332:]MSH> $d

Wednesday, November 30, 2005 9:02:29 AM

 

The great thing about this approach is that you can put any code you want into the script block. It can be a single cmd, a pipeline or a full script.

Enjoy!

Jeffrey P. Snover [MSFT]