我正在尝试编写一个小的Powershell函数,它将从某些XML日志文件中返回一些摘要数据。我写了一个简短的总结功能:
function Summarize-Log( $log )
{
$obj = New-Object Object
$obj | Add-Member NoteProperty Date $log.lastwritetime
$obj | Add-Member NoteProperty Passed ([xml](get-content $log)).suite.passed
$obj | Add-Member NoteProperty NotImplemented ([xml](get-content $log)).suite.notImplemented
return $obj
}
我想我应该能够像这样调用这个函数:
dir -recurse $logDirs | where { $_.name -eq "MyLog.xml" } | foreach{ Summarize-Log $_ }
当我这样称它时,它似乎从每次循环中读取相同的数字。 Date属性是正确的,但是从XML读取的两个属性是不正确的,就好像get-content调用返回相同的数据而不管输入参数如何。
我该如何解决这个问题?
现在它从代码中看起来好像整个文件将被读取两次。有没有更有效的方法来获取这些信息?
答案 0 :(得分:2)
你的脚本看起来很好。你确定dir | where命令实际上返回了不同的mylog.xml文件吗?
要不重新读取xml,请将xml缓存在函数的变量中:
function Summarize-Log( $log )
{
$xml = [xml](get-content $log)
$obj = New-Object pscustomobject
$obj | Add-Member NoteProperty Date $log.lastwritetime
$obj | Add-Member NoteProperty Passed $xml.suite.passed
$obj | Add-Member NoteProperty NotImplemented $xml.suite.notImplemented
$obj
}
另外,尝试摆脱使用return关键字的习惯(我已将其从重写中删除),因为任何未通过赋值给变量显式捕获的值都将从函数返回。
编辑:使用$_.fullname
代替$_
,因为$_.tostring()
(暗示)将仅解析为文件名,而不是路径+名称。
dir -rec | foreach { summarize-log $_.fullname }