29

我需要跨各种操作系统运行一些 PowerShell 脚本。它们中的大多数是英文版本,但是,有些是本地化的,例如德语、法语、西班牙语等。问题是本地系统管理员现在大多不使用 PowerShell,如果脚本失败并向他们抛出错误,而不是阅读它,他们只是将此类错误消息的屏幕截图发送给我,如果此错误的原因不明显,我会坚持将其键入 g。翻译以了解发生了什么。

是否有一个开关可以运行整个脚本或单个命令或一个参数或任何其他方式来强制 PowerShell 中的错误以英语而不是该特定机器的默认语言显示?

4

2 回答 2

22

您可以像这样更改管道线程的 CurrrentUICulture:

[Threading.Thread]::CurrentThread.CurrentUICulture = 'fr-FR'; Get-Help Get-Process

我使用的是英文系统,但在执行上述代码之前,我更新了帮助,如下所示:

Update-Help -UICulture fr-FR

有了这个,上面的 Get-Help 电话给了我英语系统的法语帮助。注意:如果我把对 Get-Help 的调用放在一个新行上,它就不起作用。确认 PowerShell 在每个管道开始之前重置 CurrentUICulture,这就是当命令位于同一管道中时它工作的原因。

在您的情况下,您需要让人们使用以下方式安装英语帮助:

Update-Help -UICulture en-US

然后像这样执行你的脚本:

[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'; .\myscript.ps1
于 2013-11-08T23:49:22.437 回答
6

[Threading.Thread]::CurrentThread.CurrentUICulture仅影响当前的单行,因此您可以将其用于执行单个 .ps1 文件。

如果要在 PowerShell 窗口中的每个命令中将消息更改为英语,则必须使用反射更改缓存在 PowerShell 运行时中的区域性设置,如下所示:

# example: Set-PowerShellUICulture -Name "en-US"

function Set-PowerShellUICulture {
    param([Parameter(Mandatory=$true)]
          [string]$Name)

    process {
        $culture = [System.Globalization.CultureInfo]::CreateSpecificCulture($Name)

        $assembly = [System.Reflection.Assembly]::Load("System.Management.Automation")
        $type = $assembly.GetType("Microsoft.PowerShell.NativeCultureResolver")
        $field = $type.GetField("m_uiCulture", [Reflection.BindingFlags]::NonPublic -bor [Reflection.BindingFlags]::Static)
        $field.SetValue($null, $culture)
    }
}

(来自https://gist.github.com/sunnyone/7486486

于 2019-11-30T17:59:49.290 回答