我正在意大利操作系统上运行以下代码:
Rename-Computer -NewName 'NewCompName' -ErrorAction Stop -DomainCredential ($dcreds)
在几种不同的情况下,我看到这些错误消息:
如果我在上面的命令前面加上
[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US';
,我会收到以下错误(除了最后一个之外,所有这些错误都已部分翻译,如您所见):
现在我的问题是我正在编写一个脚本,我需要使用不同的操作来处理不同的错误。我的公司在世界各地设有办事处,我们正在处理十多种不同语言的操作系统。我正在做的错误匹配类型就是这样的:
If ($_.Exception.Message -match 'The account already exists\.$') {...}
这是因为所有异常都是 [System.InvalidOperationException] 类型(当捕获类型化异常时),甚至剖析异常我也找不到任何对数字错误代码的引用,否则我可以通过一致且非文化的语言使用-具体。
老实说,我知道使用 MSDOS 命令时存在局限性,但在 PS/.Net 中,我希望开发人员已经考虑了这些挑战并给出了解决这些挑战的方法。我意识到错误的两个不同部分来自不同的层,因此最后一部分可能是从堆叠的向下调用或其他东西中出现的,但实际上这是我关心的专门解决所有各种情况的第二部分。
关于如何使用不同的代码部分处理这些不同的错误有什么想法吗?
我尝试过使用 [Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US' 并设置 LANG=en_US.UTF-8 都没有成功。
您获得本地化的 PowerShell 错误消息意味着您正在使用 Windows PowerShell 而不是 PowerShell (Core) 7+,因为后者从未本地化过。
保留意大利语的部分错误消息 - 尽管使用
en-US
将 UI 区域性切换为 [Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'
(美国英语) - 可能来自与 .NET Framework APIs 相关的异常消息,PowerShell 仅显示该异常消息.
但是,您可以绕过这个问题,转而采用更强大的解决方案,该解决方案不依赖于匹配错误/异常消息的文本:
检查 PowerShell 发出的
.FullyQualifiedErrorId
实例的
[ErrorRecord]
属性(可能会也可能不会包装 .NET 异常)。
它的值是文化不变,通常提供有关错误性质的具体线索 - 尽管我不知道它在您感兴趣的所有情况下是否足够具体。
这是一个简单的例子:
try {
# Provoke an error by trying to rename to the current name.
Rename-Computer $env:COMPUTERNAM -ErrorVariable err
} catch {
# Turn statement-terminating errors into script-terminating (fatal) ones.
throw
}
# Note: If no errors occurred, the body of this statement will not be entered.
switch -Regex (@($err.FullyQualifiedErrorId)) {
'^NewNameIsOldName' { "New name is the same as the old one." } # take specific action here
# ... place other, error-specific branches here.
Default { "FullyQualifiedErrorId: $_" } # print the error ID
}