改变当前的文化

家伙们,

起初:我对Powerhell强大的世界相当陌生 – 第二:我的问题是我想改变当前的文化来编辑一个excel工作簿。

这种情况让我对这个话题提出了一个新的问题(是的,我知道有很多关于“改变当前文化”和“如何使用PowerShell编辑Excel工作簿”的类似主题,不用担心)答案(像这样 )是一个很好的开始 – 但它不适合我!

所以这是我的实际问题:我有一个脚本说

function Set-Culture ([System.Globalization.CultureInfo] $culture) { [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture [System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture } Get-Culture Set-Culture('en-us') Get-Culture 

而结果说

 LCID Name DisplayName ---- ---- ----------- 3079 de-AT German (Austria) 3079 de-AT German (Austria) 

但是(正如你从上面看到的那样)将把现在的文化变成美国。 我的错误在哪里?

如果你使用的是PowerShell v2,那么这是MTA,这意味着IIRC你可以为每个pipe道调用获得不同的线程。 V1,V3和V4是STA,但是我相信PowerShell在某些执行点重置文化。 我相信像下面的东西会更好地工作:

 function Using-Culture { param( [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 $OldUICulture = [System.Threading.Thread]::CurrentThread.CurrentUICulture try { [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture [System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture Invoke-Command $script } finally { [System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture [System.Threading.Thread]::CurrentThread.CurrentUICulture = $OldUICulture } }