PowerShell:扩展语言文件中的Exception对象属性

时间:2012-11-09 15:44:24

标签: powershell

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

这非常好用,直到我在catch块中使用它来格式化错误消息。例如,当我尝试展开Exception消息时,返回一个空字符串。即使我将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:

1 个答案:

答案 0 :(得分: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>

p.s。:错误是意大利语,我在它 - 文化系统,但是错误。