我在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)
答案 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")