如何使用PowerShell从SSIS包文件中提取值?

时间:2010-01-20 16:27:39

标签: xml powershell ssis

Sql Server Integration Services包存储为具有dtsx扩展名的xml文件。我需要能够使用Powershell提取他们的构建号。文件顶部的相关部分看起来像 -

<?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命名空间让我感到困惑。在我做了get-content之后,我怎样才能得到这个值?

4 个答案:

答案 0 :(得分:1)

上面似乎不是有效的XML,但假设它是,您可以使用PowerShell 2.0中的Select-Xml cmdlet执行此操作:

$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 

答案 1 :(得分:0)

一旦文件是有效的XML(请参阅我的评论),您只需加载它并转换为XML:

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

然后,您可以使用类似属性的表示法访问节点:

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

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

答案 2 :(得分: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

答案 3 :(得分: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