Powershell每次循环返回相同的数据

时间:2010-07-06 19:37:56

标签: xml powershell

我正在尝试编写一个小的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调用返回相同的数据而不管输入参数如何。

我该如何解决这个问题?

现在它从代码中看起来好像整个文件将被读取两次。有没有更有效的方法来获取这些信息?

1 个答案:

答案 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 }