获取异常的本地化消息

后端开发 2026-07-11

当我在函数参数中添加一个 [ValidatePattern(...)],并将实际参数设为一个错误的值时,会出现一个错误,文本为 Cannot validate argument on parameter '<parameter name>'. The argument "{0}" does not match the "{1}" pattern. Supply an argument that matches "{1}" and try the command again.

至少在英文Windows上如此。但我有多台电脑,运行着不同语言的Windows。

如何以编程方式获取该消息的本地化版本?

我尝试在 ErrorRecord 中获取异常,并用 [...]::new() 创建一个新的异常,我甚至还试过 InnerException,但它们只是带有自定义文本的通用异常。

是否存在一个文件/某种方法可以获取本地化文本?还是被硬编码在某些C#函数中?

Name                           Value
----                           -----
PSVersion                      5.1.19041.6926
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.6926
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

解决方案

前言

  • 下面的解决方案仅在Windows PowerShell上工作(这是随Windows一起提供、仅Windows的旧版PowerShell,其最新且最终版本为5.1),因为它已被本地化为多种语言。

  • 要查看某一系统上Windows PowerShell可用语言的具体列表,请运行:

    bash Get-Item $PSHOME\* -Include [a-z][a-z], [a-z][a-z]-* +要将这些简写的文化名称翻译成完整的显示名称,例如 de-DE,请运行:

    bash [cultureinfo] 'de-DE' +这些简写的文化名称对应于 $PSHOME 中的子目录,在其中你将找到包含该文化本地化文本元素的 *.dll.mui 文件。

    • 使用Windows MUI API函数 应该可以直接从这些DLL中提取本地化文本元素;然而,这需要你了解它们的(很可能是非公开的)标识符;下一节中的解决方案仅向你展示如何通过将PowerShell整体切换到该语言并提交一个输出所关注文本元素的命令来“隐式”检索它们。
    • 与此相对的是 PowerShell (Core) 7 已尚未本地化(截至v7.6.x,短期内不太可能改变):它的所有文本资源都是英文;关于未来本地化的潜在问题正在GitHub issue #19860中跟踪。

要将Windows PowerShell切换到某种人类语言,您必须确保两点:

  • (a) 该语言要么是系统的安装语言,要么已经通过语言包安装(例如通过设置应用程序)。
  • (b) [cultureinfo]::CurrentUICulture 必须能反映所给语言,例如德国德语在德国的显示名称为 de-DE;这可以通过下列两种方式之一来确保:

  • 持久地:使用设置应用将Windows显示语言改为所需语言;[1] 这样就会相应地将 [cultureinfo]::CurrentUICulture 的值持久地改为该语言。

  • 临时地:在脚本开头显式设置 [cultureinfo]::CurrentUICulture

    • 警告:在交互式提示符下,Windows PowerShell不幸地在每次命令执行后会重置对 [cultureinfo]::CurrentUICulture[cultureinfo]::CurrentCulture 的任何更改(幸运的是,PowerShell (Core) 7已不再这样做)。 要在给定的交互式Windows PowerShell会话中“保持”更改并在所有未来会话中通过 $PROFILE 文件实现,请参阅此回答中的变通方法。

下面的 示例 展示了一个临时切换到 de-DE 作为显示语言,从而使错误信息以德语显示:

# NOTE: Windows PowerShell only.
& {

 # Switch the display language to German.
 [cultureinfo]::CurrentUICulture = 'de-DE'

 # Define an advanced script block with a [ValidatePattern()] attribute
 # and pass an argument that fails the validation.
 & { [cmdletbinding()]param([ValidatePattern('^..$')] $param) } 123

}

你将看到如下的德语错误信息:

Das Argument für den Parameter "param" kann nicht überprüft werden. Das Argument "123" entspricht nicht dem Muster "^..$". Geben Sie ein Argument an, das
"^..$" entspricht, und führen Sie den Befehl erneut aus.
In Zeile:8 Zeichen:65
+  & { [cmdletbinding()]param([ValidatePattern('^..$')] $param) } 123
+                                                                 ~~~
    + CategoryInfo          : InvalidData: (:) [], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError

[1] 直接跳转到设置应用相关页面的便捷命令是
Start-Process ms-settings:regionformatting
在那里你也可以选择安装其他语言。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章