PowerShell UICulture 与 Windows 设置

san*_*ica 1 powershell currentuiculture uiculture windows-10

在我在 Win 10 下修改 PS 5.1 期间,与问题的目标完全更改当前 PowerShell 会话的语言(包括文化)相关,\n我遇到了几个相关问题。

\n
    \n
  1. 与 UICulture 关联的 Windows 设置在哪里?\n我没有找到“区域和语言”控制面板的“键盘和语言”选项卡,如此所示。

    \n
  2. \n
  3. 这可以在 PS 中持续更改吗?\n到目前为止我发现的所有内容都只保留在会话中。

    \n
  4. \n
\n
\n

设置设置- >时间和语言->语言-> Windows 显示语言显示“Espa\xc3\xb1ol (Espa\xc3\xb1a)”,PS 给出

\n
> Get-UICulture ; [System.Threading.Thread]::CurrentThread.CurrentUICulture ; [CultureInfo]::CurrentUICulture ;\nLCID             Name             DisplayName\n----             ----             -----------\n1033             en-US            English (United States)\n1033             en-US            English (United States)\n1033             en-US            English (United States)\n
Run Code Online (Sandbox Code Playgroud)\n

没有任何干预更改并且在刚刚启动的会话中。

\n

mkl*_*nt0 8

.NET中,文化( System.Globalization.CultureInfo)用于控制(人类)文化特定的用于显示表示的两个相关但独立的方面

  • 反映在 中的有效UI文化[cultureinfo]::CurrentUICulture控制应用于UI 元素和最终用户消息(例如错误消息)的(人类)语言。

    • 在 Windows 上,它的值继承自所谓的Windows显示语言,这是一个持久的、特定于用户的设置,您可以按如下所述进行修改。

    • 在 PowerShell 中,您还可以通过自动变量(仅$PSUICulture报告区域性名称Get-UICulture)或cmdlet(报告[cultureinfo]实例)查询有效的 UI 区域性。
      警告:在Windows PowerShell中,报告的值是在会话启动时生效的值(这是当时的持久值),因此不会反映任何会话中的更改。此问题已在 PowerShell [Core] v6+ 中得到纠正。

  • 中反映的有效文化控制[cultureinfo]::CurrentCulture用于表示数字、货币值和日期/时间值的格式

    • 在 Windows 上,它的值继承自活动区域设置(也称为区域格式),它们是持久的、特定于用户的设置,您可以按如下所述进行修改。

    • 在 PowerShell 中,您还可以通过自动变量(仅$PSCulture报告区域性名称Get-Culture) cmdlet(报告[cultureinfo]实例)查询有效的 UI 区域性。
      警告:在Windows PowerShell中,报告的值是在会话启动时生效的值,因此不会反映任何会话中的更改。此问题已在 PowerShell [Core] v6+ 中得到纠正。


切换到不同的文化:

对于当前用户来说,交互式(GUI)方法始终是持久的

  • UI 文化,又名 Windows 显示语言

    • 在 Windows 10 上,打开“设置”应用程序(例如,通过“开始”菜单),转到类别Time & Language,然后单击Language左侧边栏中的 。

      • 快捷键:

        • 快速打开“设置”应用程序:

          • 使用键盘快捷键WinKey-i
          • 运行start ms-settings:(也适用cmd)。
        • 在“开始”菜单中,只需键入“语言”并Language Settings从结果中进行选择 - 这会将您直接带到“设置”应用程序中的相关页面。

        • 运行intl.cpl以打开旧版Region控制面板小程序,然后单击Language preferences链接,这会将您带到“设置”应用程序中的相关页面。

  • 文化,又名区域格式(locale)

    • 在 Windows 10 上,打开“设置”应用程序(例如,通过“开始”菜单),转到类别Time & Language,然后单击Region左侧边栏中的 ,然后在下面选择所需的区域性Regional formatRegion顶部的设置不控制区域性)。

      • 快捷键:

        • 在“开始”菜单中,只需键入“区域格式”并Set regional format从结果中进行选择 - 这会将您直接带到“设置”应用程序中的相关页面。

        • 运行intl.cpl以打开旧版控制面板小程序,然后从下拉列表Region中选择所需的区域性。Format:

注意:这些设置同样适用于 .NET 和非 .NET 应用程序,假设这些应用程序设计为尊重用户的区域格式(区域设置、文化)和显示语言(UI 文化)并附带特定于语言的资源。相比之下,通过/ (见下文)
进行仅会话内的更改仅适用于 .NET 应用程序。[cultureinfo]::CurrentUICulture[cultureinfo]::CurrentCulture

编程方法:

  • 持久的当前用户更改(相当于 GUI 方法)

    • UI 文化,又名 Windows 显示语言

      • 没有 Set-UICulturecmdlet,但在 Windows 8 / Windows Server 2012 R2 及更高版本中您可以使用 Set-WinUILanguageOverridecmdlet。
        请注意,与目标区域性相关的语言的语言包必须随系统附带或必须已事先下载。

      • 重要信息:只有在您注销并重新登录或重新启动后,更改才会生效。

    • 文化,又名区域格式(locale)

      • 使用Set-CultureWindows 8/Windows Server 2012 R2 及更高版本中提供的 cmdlet。

      • 重要提示:更改仅在未来的PowerShell 会话中生效,但不需要注销/重新启动。

  • 仅在会话中进行的更改

    • 重要提示:此类更改仅适用于基于 .NET 的应用程序。因此,从文化已更改的 PowerShell 会话调用非 .NET 控制台应用程序不会对该控制台应用程序产生影响。但是,此更改确实会对PowerShell cmdlet、脚本和函数的调用生效。即使更改的范围在技术上仅限于当前线程,PowerShell 也会通过 PowerShell 远程处理(例如)将更改传播到线程(Start-ThreadJobForEach-Object -Parallel)中执行的代码以及在远程计算机Invoke-Command上执行的代码。然而奇怪的是,从 PowerShell 7.0 开始,在子进程中运行的后台作业( )不会继承调用线程的区域性Start-Job- 请参阅此 GitHub 问题

    • 可以赋值[cultureinfo]::CurrentUICulture/来改变当前线程[cultureinfo]::CurrentCulture的UI文化/文化(仅限,非持久);例如,以下命令使用法语输出当前日期和时间:

      • [cultureinfo]::CurrentCulture = 'fr-FR'; Get-Date
    • 警告:由于Windows PowerShell 中的错误,在每个交互式提交的命令后,[cultureinfo]::CurrentUICulture[cultureinfo]::CurrentCulture会意外重置为会话启动值;此问题已在 PowerShell [Core] v6+ 中修复 - 请参阅此答案

    • 结果是,如果您想要使用与持久配置不同的文化来运行整个 PowerShell 会话,您可以 在 PowerShell [Core] v6+ 中的文件进行分配[cultureinfo]::CurrentUICulture[cultureinfo]::CurrentCulture$PROFILE,但您需要Windows PowerShell解决方法- 请参阅此答案

      • 警告:Windows PowerShell静态初始化$PSUICulture$PSCulture因此这些变量反映解决方法(依赖于修改非公共字段)设置有效区域性;然而,Get-UICulture/Get-Culture以及[cultureinfo]::CurrentUICulture/[cultureinfo]::CurrentCulture做。