强制在本地化系统上以英语输出 PowerShell 错误



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

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

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

[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)

最新更新