我正在编写一个脚本,其中包含许多需要输出到日志或屏幕的字符串。为了简化维护,我创建了一个非常简单的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:
答案 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。:错误是意大利语,我在它 - 文化系统,但是错误。