2012-11-09 32 views
1

我正在編寫一個腳本,其中包含大量需要輸出到日誌或屏幕的字符串。爲了簡化維護,我創建了一個非常簡單的lang.xml文件,用於存儲字符串。很多字符串顯示腳本中變量中保存的信息,所以我編寫了一個小cmdlet,它將在返回的xml #text節點中擴展字符串。PowerShell:擴展語言文件中的Exception對象屬性

這個工程非常好,直到我用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: 

回答

0

我測試過你的代碼和xml例子。

它爲我,之後我在lang.xml文件中刪除了</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:錯誤在意大利語中,我是在它上面 - 它是文化系統,但卻是正確的錯誤。

+0

這真的很奇怪 - 整個''只是一個錯字,總是養成關閉標籤的習慣。它現在正在爲我工​​作,儘管我會將你的標記作爲答案,因爲你的好運就是我所需要的。 –

+0

很高興分享幸運! :) 謝謝! –