使用powershell将节点附加到xml文件

时间:2011-12-07 17:18:04

标签: xml powershell

我在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 :(得分:0)

我在使用PowerShell中的XML处理类似的事情时遇到了麻烦。在大多数情况下,我认为我正在使用的文件的XML格式不喜欢PowerShell。我可以运行没有错误的命令,查看我的XML文件,没有添加任何内容。我通常最终将文件视为普通文本文件。然而...

对于您的实例,我认为您可能希望重新评估您查询信息的方式。您声明它是针对每个数据库运行的,如果您使用sys.dm_db_index_usage_stats,则可以为实例上的任何数据库中使用的每个索引获取一个查询。哪个Kimberly Tripp提供了一个可以使用的快速查询here(这是下面使用的脚本)。

这反过来会为您提供一个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

我知道您可能有理由对您环境中的每个单独的数据库执行此操作,但这似乎更有效,并且可以减少脚本中的代码。

答案 1 :(得分:0)

试一试。为了复制你的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")
相关问题