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 或其他环境也有相同的本地化资源行为。
备注:内容仅供参考。
