2010-01-20 72 views
0

Sql Server Integration Services包存儲爲帶有dtsx擴展名的xml文件。我需要能夠使用Powershell提取他們的內部版本號。在文件頂部的相關部分看起來喜歡 -如何使用PowerShell從SSIS包文件提取值?

<?xml version="1.0"?>
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts">
<DTS:ExecutableType="MSDTS.Package.1">
<DTS:Property DTS:Name="PackageFormatVersion">2</DTS:Property>
<DTS:Property DTS:Name="VersionMajor">1</DTS:Property>
<DTS:Property DTS:Name="VersionMinor">0</DTS:Property>
<DTS:Property DTS:Name="VersionBuild">265</DTS:Property>

我需要提取VersionBuild號碼,但DTS命名空間令我困惑。在我完成獲取內容之後,我如何獲得價值?

+0

這甚至不是有效的XML ......第三行中的'='很奇怪。 – Joey 2010-01-20 16:31:27

+0

是的,這就是我所指的。 :-) – 2010-01-20 17:37:07

+0

實際上,它是有效的XML,使用Namespaces(xmlns:part) – user1390375 2017-07-18 03:51:41

回答

0

作爲SQL Server Powershell Extensions的一部分,CodePlex項目中有一個SSIS模塊。在這裏你可以做這樣的事情:

import-module SSIS 
$package = Get-ISPackage -path "C:\Program Files\Microsoft SQL Server\100\DTS\Packages\sqlpsx1.dtsx" 
$package.VersionBuild 
0

一旦該文件是有效的XML(見我的意見),你可以簡單地加載和轉換爲XML:

$x.Executable.Property | Where-Object { $_.Name -like 'Version*' } 

Name              #text 
----              ----- 
VersionMajor            1 
VersionMinor            0 
VersionBuild            265 

$x = [xml] (gc file.xml) 

然後,您可以用財產類符號訪問節點

0

以上沒有出現有效的XML,但假設它,你可以使用選擇的XML命令用PowerShell 2.0中做到這一點也:

$ns = @{ dts = 'www.microsoft.com/SqlServer/Dts' } 
$xpath = '//dts:Property[@dts:Name="VersionBuild"]' 
[xml](get-content file.xml) | Select-Xml $xpath -Namespace $ns | %{$_.Node} 

Name         #text 
----         ----- 
VersionBuild       265 
0

下面是提取所有的SQL語句的例子,但它可以很容易地適應挑選出的任何元素,如通過改變的SelectNodes的XPath的變量或連接命令:

$package = [xml](Get-Content 'package.dtsx') 
$ns = [System.Xml.XmlNamespaceManager]($package.NameTable) 
$ns.AddNamespace("DTS", "www.microsoft.com/SqlServer/Dts") 

$nodes = $package.SelectNodes("//property[@name = 'SqlCommand']", $ns) 

$sqls = $nodes | % { 

    New-Object PSObject -Property @{ 
     sql = $_.'#text' 
     name = $_.ParentNode.parentNode.name 
    } 
} 

$sqls 
相關問題