在远程会话中运行时 get-culture 返回错误结果

在远程会话中运行时 get-culture 返回错误结果

我想使用 powershell 检查多台机器上的数字小数分隔符。如果我get-culture在本地 powershell 中运行,结果是正确的。它将返回英语(英国)和正确的数字格式,例如小数分隔符“。”。但如果我远程运行该命令:

Invoke-Command  -ComputerName $server { (get-culture) }

Invoke-Command  -ComputerName $server { (get-culture).NumberFormat.NumberDecimalSeparator}

结果是错误的。它返回的是德语(德国),这是我调用命令的机器的语言。请帮忙。

答案1

您可以检查系统水平文化设置Get-WinSystemLocale


Get-Culture仅返回用户级文化设置,任何用户都可以设置。正如您所发现的,Powershell 远程处理会自动在会话中应用您的本地文化。您可以使用以下方式指定不同的Culture和/或UICulture名称SessionOption

Invoke-Command -ComputerName $server -SessionOption @{culture='en-gb'} -ScriptBlock {Get-Culture}

当前正在运行的 powershell 进程的文化$PSCulture是只读的,无法更改。

如果您需要使用适合远程系统的正确文化来运行远程命令,则可以在开始会话之前进行检查,如下所示:

# check the remote system culture before running script
$remoteCulture = Invoke-Command -ComputerName $server -ScriptBlock {Get-WinSystemLocale}

Invoke-Command -ComputerName $server -SessionOption @{culture=$remoteCulture} -ScriptBlock {
  # some command that requires the remote culture
  Get-Culture
}

或者,设置从会话启动的新线程/进程的文化:

Invoke-Command -ComputerName $server -ScriptBlock {
  [system.threading.thread]::CurrentThread.CurrentCulture = Get-WinSystemLocale
  Start-Job {Get-Culture} | Receive-Job -Wait
}

相关内容