我正在编写一个脚本,其中包含许多需要输出到日志或屏幕的字符串。为了帮助简化维护,我创建了一个非常简单的 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: