問題的ConvertTo-CSV -UseCulture忽略當前線程的文化
是否有可能迫使PowerShell中的Windows會話與en-GB
文化運行時導出爲CSV法語格式?
更多信息
我希望利用法國文化規則的一些數據導出爲CSV(即CSV的分隔符設置爲分號,也與使用小數逗號的數字,和其他文化的格式差異;所以只使用-Delimiter
參數是不夠的)。
我想出了下面的代碼(基於https://stackoverflow.com/a/7052955/361842)
function Set-Culture
{
[CmdletBinding(DefaultParameterSetName='ByCode')]
param (
[Parameter(Mandatory,ParameterSetName='ByCode',Position=1)]
[string] $CultureCode
,
[Parameter(Mandatory,ParameterSetName='ByCulture',Position=1)]
[System.Globalization.CultureInfo] $Culture
)
begin {
[System.Globalization.CultureInfo] $Culture = [System.Globalization.CultureInfo]::GetCultureInfo($CultureCode)
}
process {
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $Culture
[System.Threading.Thread]::CurrentThread.CurrentCulture = $Culture
}
}
function Invoke-CommandInCulture {
[CmdletBinding()]
param (
[Parameter(Mandatory,ParameterSetName='ByCode',Position=1)]
[string]$CultureCode
,
[Parameter(Mandatory,Position=2)]
[ScriptBlock]$Code
)
process {
$OriginalCulture = Get-Culture
try
{
Set-Culture $CultureCode
Write-Verbose (Get-Culture) #this always returns en-GB
Invoke-Command -ScriptBlock $Code
}
finally
{
Set-Culture $OriginalCulture
}
}
}
下面的代碼意味着這種方法可行:
Invoke-CommandInCulture -CultureCode 'fr' -Code {
[System.Threading.Thread]::CurrentThread.CurrentUICulture
[System.Threading.Thread]::CurrentThread.CurrentCulture
} #shows that the command's thread's culture is French
Invoke-CommandInCulture -CultureCode 'fr' -Code {
get-date
} #returns the current date in French
然而PowerShell有它發生了什麼事情
的自己的想法Invoke-CommandInCulture -CultureCode 'fr' -Code {
get-culture
"PSCulture: $PSCulture"
"PSUICulture: $PSUICulture"
} #returns my default (en-GB) culture; not the thread's culture
而這會影響轉換爲CSV的邏輯:
Invoke-CommandInCulture -CultureCode 'fr' -Code {
get-process | ConvertTo-CSV -UseCulture
} #again, uses my default culture's formatting rules; not the FR ones
本博客解釋了一些奇怪的行爲;即在當前管道完成後重置培養物;儘管到目前爲止我還沒有能夠解決'Export-Csv'的問題,即使有了這些知識/我看到的行爲似乎與此相矛盾... – JohnLBevan
鏈接到上面提到的博客:http:// www .xipher.dk/WordPress /?p = 706 – JohnLBevan