PAYATHON 2026

PowerShell 5.1 如何获取本地化的 ValidatePattern 错误消息?

数据小许

结论

Windows PowerShell 5.1 会根据当前 UI 语言本地化 ValidatePattern 的错误文本。要取得指定语言的消息,先将 [cultureinfo]::CurrentUICulture 设置为该语言,再触发相同的参数验证,并从捕获的 ParameterBindingValidationException 中读取 Exception.Message。异常生成后再切换语言,已有消息不会重新翻译。

下面的示例用 de-DE 生成一条德语错误消息:

$oldUICulture = [System.Globalization.CultureInfo]::CurrentUICulture

try {
    [System.Globalization.CultureInfo]::CurrentUICulture = [cultureinfo] 'de-DE'

    try {
        & {
            [CmdletBinding()]
            param(
                [ValidatePattern('^..$')]
                [string] $Value
            )
        } '123'
    }
    catch [System.Management.Automation.ParameterBindingValidationException] {
        $_.Exception.Message
    }
}
finally {
    [System.Globalization.CultureInfo]::CurrentUICulture = $oldUICulture
}

将 de-DE 换成目标语言的文化名,再按实际参数使用的模式和值替换示例中的正则表达式和无效值。返回的消息会包含本次验证使用的参数、输入值和模式。

适用条件

此方法适用于已安装相应语言资源的 Windows PowerShell 5.1。目标语言必须是系统安装语言,或已通过 Windows 语言包安装;目标系统还需要有该语言对应的 PowerShell 本地化资源。PowerShell 的本地化消息资源位于 $PSHOME 下相应文化目录中的 .dll.mui 文件里。要从 MUI 文件中提取单条资源,需要知道资源标识符,直接触发验证更简单。问题及其解答中的语言切换示例

当参数值与正则表达式不匹配时,ValidatePattern 会让 PowerShell 运行时产生验证错误。Microsoft Learn:ValidatePattern 属性

注意事项

  • 如果需要捕获验证异常,应在调用带验证参数的函数或脚本块时执行 try/catch。重新创建已生成的异常对象,无法按另一种 UI 语言取得对应的资源文本。
  • 在 Windows PowerShell 5.1 交互提示符中,手动设置的 CurrentUICulture 可能会在每条命令执行后重置。因此,示例把设置语言和触发验证放在同一段脚本中,便于一次性获取消息。
  • 问题描述中的环境是 Windows PowerShell 5.1,不能据此推断 PowerShell 7 或其他环境也有相同的本地化资源行为。

备注:内容仅供参考。