【问题标题】:How do I extract a value from SSIS package file using PowerShell?如何使用 PowerShell 从 SSIS 包文件中提取值?
【发布时间】:2010-01-20 16:27:38
【问题描述】:

Sql Server 集成服务包存储为扩展名为 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 命名空间让我感到困惑。获取内容后,如何获取价值?

【问题讨论】:

  • 这甚至不是有效的 XML ...第三行中的 = 很奇怪。
  • 是的,这就是我所指的。 :-)
  • 实际上,它是有效的 XML,使用命名空间(xmlns: 部分)

标签: xml powershell ssis


【解决方案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 

【讨论】:

    【解决方案2】:

    作为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】:

      一旦文件是有效的 XML(见我的评论),您可以简单地加载它并转换为 XML:

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

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

      $x.Executable.Property | Where-Object { $_.Name -like 'Version*' }
      
      Name                                                        #text
      ----                                                        -----
      VersionMajor                                                1
      VersionMinor                                                0
      VersionBuild                                                265
      

      【讨论】:

        【解决方案4】:

        下面是一个提取所有 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-23
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多