добавление узла в XML-файл с PowerShell - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть подпрограмма в powershell, которая запрашивает статистику использования индекса. Запрос выполняется для каждой базы данных на сервере и выдает фрагмент XML. Я пытаюсь получить все результаты в одном XML-файле. Весь код работает, кроме части, которая добавляет узлы к существующему XML-файлу. Я пробовал AppendNode и ImportNode безрезультатно. Вот фрагмент кода, который не работает

$xml = Invoke-Sqlcmd -Query... | ConvertTo-Xml

$file_xml = [xml](Get-Content $target_file) 
$index_nodes = $xml.SelectNodes("/Objects/Object")  
foreach($index_node in $index_nodes){
    $file_xml.ImportNode($index_node, $true)            
}               
$file_xml.Save($target_file)

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Дайте это попробовать.Чтобы воспроизвести вашу структуру XML, я использовал ConvertTo-XML для создания двух объектов XML.Объекты второго добавляются к первому и сохраняются на диск.

$xml1 = dir -path C:\Users\andy | ? {$_.PsIsContainer} | ConvertTo-Xml
$xml2 = dir -path C:\ | ? {$_.PsIsContainer} | ConvertTo-Xml

$objectNodes = $xml2.SelectNodes('/Objects/Object')
if ($objectNodes) {
    foreach ($objectNode in $objectNodes) {
        $importedNode = $xml1.ImportNode($objectNode, $true)
        $xml1.DocumentElement.AppendChild($importedNode) | Out-Null
    }
 }

$xml1.Save("C:\Users\andy\Desktop\output.xml")
0 голосов
/ 08 декабря 2011

У меня были проблемы при выполнении аналогичных вещей, работающих с XML в PowerShell.В большинстве случаев я считаю, что формат XML файла, с которым я работаю, просто не похож на PowerShell.Я могу выполнить команды без ошибок, посмотреть на мой файл XML, и ничего не было добавлено.Я обычно отношусь к файлу как к обычному текстовому файлу.Однако ...

В вашем случае, я думаю, вы, возможно, захотите переоценить то, как вы запрашиваете информацию.Вы утверждаете, что он запускается для каждой базы данных, когда, если вы используете <a href="http://msdn.microsoft.com/en-us/library/ms188755.aspx" rel="nofollow">sys.dm_db_index_usage_stats</a>, вы можете получить один запрос для каждого индекса, используемого в любой базе данных в экземпляре.Какой Кимберли Трипп предлагает быстрый запрос, который можно использовать здесь (этот скрипт используется ниже).

Это, в свою очередь, предоставит вам один XML-файл:


$indexStats = @"
SELECT getdate() AS RunTime
, DB_NAME(i.database_id) as DatabaseName
, OBJECT_NAME(i.object_id, i.database_id) as ObjectName
, i.user_seeks
, i.last_user_seek
, i.user_scans
, i.last_user_scan
, i.user_lookups
, i.last_user_lookup
FROM sys.dm_db_index_usage_stats AS i
WHERE object_id > 100
"@

$xml = Invoke-Sqlcmd -ServerInstance  -Database master -Query $indexStats |
 ConvertTo-Xml

Я понимаю, что у вас может быть причина сделать это для каждой отдельной базы данных в вашей среде, но это, кажется, более эффективно и требует меньше кода, чтобы не отставать от вашего сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...