【问题标题】:Forcing PowerShell errors output in English on localized systems在本地化系统上强制以英文输出 PowerShell 错误
【发布时间】:2013-11-08 22:25:14
【问题描述】:

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

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以像这样更改管道线程的 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
    

    【讨论】:

    • 如果您需要运行许多命令,$ENUS="[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'" then invoke-expression $ENUS; Get-Help Get-Process "invoke-expression $ENUS;" 会短一些。
    • 不要忘记以提升的权限运行 PowerShell 以执行 Update-Help
    • @anton_rh ... 或者您可以将区域性更改命令放入 %HOMEDRIVE%%HOMEPATH%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 以使所有 PS 执行的区域性更改永久化。
    【解决方案2】:

    [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

    【讨论】:

    • 不错的解决方法;幸运的是,PowerShell [Core] v6+ 不再需要它。要更改 CurrentCulture(数字、货币、日期格式)而不是 CurrentUICulture,请改为修改非公共 m_Culture 字段:(虽然通过反射修改非公共字段通常是不明智的,但应该是在这种情况下很好,因为 Windows PowerShell(最高 v5.1 的版本)将没有新的开发。)
    • (尽管有格式,但此功能有效。)function Set-PowerShellCulture { param([Parameter(Mandatory)] [cultureinfo] $culture) [System.Reflection.Assembly]::Load('System.Management.Automation'). GetType('Microsoft.PowerShell.NativeCultureResolver'). GetField('m_Culture', 'NonPublic, Static'). SetValue($null, $culture) }
    • 另一件值得注意的事情:Windows PowerShell 静态初始化$PSUICulture$PSCulture,因此这些变量反映了由这些变通方法;但是,Get-UICulture / Get-Culture 以及 [cultureinfo]::CurrentUICulture / [cultureinfo]::CurrentCulture 可以。
    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 2015-08-27
    • 2014-01-25
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多