如何使用 PowerShell 在本地化操作系统中获取一致的错误消息

问题描述 投票:0回答:1

我正在意大利操作系统上运行以下代码:

Rename-Computer -NewName 'NewCompName' -ErrorAction Stop -DomainCredential ($dcreds)

在几种不同的情况下,我看到这些错误消息:

  1. 不可能在“NewCompName”中使用计算机“OldCompName”,原因如下:L'account di riferimento è momentaneamente bloccato e non è concentito l'accesso。
  2. 重命名计算机:不可能将计算机“OldCompName”更改为“NewCompName”,原因是:名称不正确或密码不正确。
  3. 不可能将计算机“OldCompName”置于“NewCompName”中,原因如下:帐户存在。
  4. 重命名计算机:不可能将计算机“OldCompName”更改为“NewCompName”,原因如下:Accesso negato。
  5. 重命名-计算机:将计算机“OldCompName”更改为“NewCompName”,然后将其更改为新名称。

如果我在上面的命令前面加上

[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US';
,我会收到以下错误(除了最后一个之外,所有这些错误都已部分翻译,如您所见):

  1. 重命名-计算机:由于以下异常,无法将计算机“OldCompName”重命名为“NewCompName”:L'account di riferimento è momentaneamente bloccato e non è consentito l'accesso。
  2. 重命名-计算机:由于以下异常,无法将计算机“OldCompName”重命名为“NewCompName”:Nome utente o 密码不正确。
  3. 重命名计算机:由于以下异常,无法将计算机“OldCompName”重命名为“NewCompName”:帐户 già eciente。
  4. 重命名计算机:由于以下异常,无法将计算机“OldCompName”重命名为“NewCompName”:Accesso negato。
  5. 重命名-计算机:使用新名称“NewCompName”跳过计算机“OldCompName”,因为新名称与当前名称相同。

现在我的问题是我正在编写一个脚本,我需要使用不同的操作来处理不同的错误。我的公司在世界各地设有办事处,我们正在处理十多种不同语言的操作系统。我正在做的错误匹配类型就是这样的:

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 exception localized
1个回答
0
投票
  • 您获得本地化的 PowerShell 错误消息意味着您正在使用 Windows PowerShell 而不是 PowerShell (Core) 7+,因为后者从未本地化过。

  • 保留意大利语的部分错误消息 - 尽管使用

    en-US
    将 UI 区域性切换为
    [Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'
    (美国英语) - 可能来自与 .NET Framework APIs 相关的异常消息,PowerShell 仅显示该异常消息.

    • 但是,虽然内置 .NET Framework API 也尊重 UI 文化(与内置 .NET (Core) API 不同,后者似乎没有本地化),但这似乎并没有扩展到 system错误消息,即与从 WinAPI 函数返回的错误代码相关的消息。
  • 但是,您可以绕过这个问题,转而采用更强大的解决方案,该解决方案不依赖于匹配错误/异常消息的文本:

    • 检查 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
}
© www.soinside.com 2019 - 2024. All rights reserved.