1

我正在编写一个脚本,其中包含许多需要输出到日志或屏幕的字符串。为了帮助简化维护,我创建了一个非常简单的 lang.xml 文件来存储字符串。许多字符串显示脚本中变量中保存的信息,因此我编写了一个小 cmdlet,它将扩展返回的 xml #text 节点中的字符串。

在我在 catch 块中使用它来格式化错误消息之前,这非常有效。例如,当我尝试展开异常消息时,会返回一个空字符串。即使我将 Exception 对象传递给 cmdlet,它也会扩展为空字符串。下面是 XML 和 cmdlet 的片段,以及示例输出。

示例 XML:

<?xml version="1.0" ?>
  <lang>
    <keyword name="ERRMessage">
      <string>"Error message: $($Exception.Exception.Message)"</string>
    </keyword>
  </lang>
</xml>

cmdlet:

function Read-Lang
{
  [CmdletBinding()]
  param(
    [Parameter( Mandatory=$true,
                ValueFromPipeline=$true,
                ValueFromPipelineByPropertyName=$true,
                HelpMessage="The name atttribute of a keyword in lang.xml")]
    [string[]] $Keyword,
    $Exception
  )

  begin
  {
    if ( $global:LangXML -eq $null )
    {
      Write-Debug "Language XML has not been loaded, loading now."
      $global:LangXML = [xml] (Get-Content '.\lang.xml')
    }
  }

  process
  {
    foreach ( $name in $Keyword)
    {
      $Query = "/lang/keyword[@name=`"$name`"]/string"
      $global:LangXML.SelectNodes($Query) | 
        ForEach-Object { $ExecutionContext.InvokeCommand.ExpandString($_."#text") }       
    }
  }
}

例子:

try { get-content goo -ErrorAction Stop} catch { Read-Lang -KeyWord 'ERRMessage'  -Exception $_ }

预期输出:

Error Message: Cannot find path 'path\to\goo' because it does not exist.

实际输出:

Error Message:
4

1 回答 1

0

我已经用 xml 示例测试了你的代码。

它对我有用,在我删除文件中的</xml>结束标签后lang.xml,这给了我错误

$global:LangXML = [xml] (Get-Content '.\lang.xml')

这是我得到的:

PS C:\ps> try { get-content goo -ErrorAction Stop} catch { Read-Lang -KeyWord 'ERRMessage'  -Exception $_ }
Error message: Impossibile trovare il percorso 'C:\ps\goo' perché non esiste.
PS C:\ps>

ps:错误是意大利语,我在it-it文化系统上,但这是正确的错误。

于 2012-11-09T16:00:12.887 回答