我需要跨各种操作系统运行一些PowerShell脚本。其中大多数都是英文版,但有些是本地化的,例如德语,法语,西班牙语等。问题是本地系统管理员现在大部分时间都没有PowerShell,如果脚本失败并向他们抛出错误,而不是读它,他们只是发送这样的错误信息的截图给我,如果这个错误的原因不明显,我很难打字到g。翻译以找出正在发生的事情。
是否有一个开关我可以使用或参数或任何其他方式运行整个脚本或单个命令来强制PowerShell中的错误以英语显示而不是该特定机器的默认语言?
答案 0 :(得分:16)
您可以像这样更改管道线程的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
答案 1 :(得分:0)
[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)
}
}