Powershell возвращает идентичные данные каждый раз через цикл - PullRequest
1 голос
/ 06 июля 2010

Я пытаюсь написать небольшую функцию 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 Ответ

2 голосов
/ 06 июля 2010

Ваш скрипт выглядит отлично. Вы уверены, что команда 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 (я удалил его из моего перезаписи), так как любое значение, явно не захваченное присвоением переменной, будет возвращено из функции.

edit: используйте $_.fullname вместо $_, так как $_.tostring() (что подразумевается) разрешит только имя файла, а не путь + имя.

dir -rec | foreach { summarize-log $_.fullname }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...