2017-03-08 14 views
1

我正在使用下面的powershell脚本从dtsx pkg(读取为xml)读取版本构建。只要它位于本地或共享路径中,我就可以读取该文件。但是,其中一个包位于Integration Services服务器路径上,我无法在该路径上简单使用get-content。以下是我用于本地/共享路径文件的代码。当包存储在集成服务服务器中时使用powershell读取SSIS包

$xml = [xml](get-content *filepath*) 
$value = $xml.Executable.Property | Where-Object {$_.Name -like 'VersionBuild'} 
$ver_dev = $value.'#text' 

我读网使用互联网上,但我想那就是映射共享路径,整合服务器的路径是不是真的,因为我们可以使用SQL服务器只能访问它(按我的理解)的共享路径,作为显示的路径在SQL服务器如下Server_path

我也遇到了一些代码使用PowerShell调用在SQL服务器软件包来了,但是我在PowerShell中(才开始对这个版本比较的目的)的新手,可能很难理解任何东西。

ocde本身很简单,坦率地说,这就是促使我自动执行此版本比较的原因,但是我一直坚持从此服务器路径读取数据。任何帮助将不胜感激。谢谢

+0

如果有人对此有任何参考,那也是很棒的。 – user3243678

回答

1

如果您的软件包存储在Integration Services目录中,则下面的this link中的代码会将.ispac文件(这是一个zip文件)保存到本地存储并提取内容。下面的代码基于此,尽可能下载一个特定的.ispac项目文件。从那里,你需要提取dtsx包(如链接的例子)。

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null 

$SsisServer = 'SERVERNAME' 
$Folder = 'FOLDER' 
$ProjectName = 'PROJECT' 

## Build the list of SQL Server names. 
$smo = New-Object Microsoft.SqlServer.Management.Smo.Server $SsisServer 

$SsisNamespace = "Microsoft.SqlServer.Management.IntegrationServices" 
[System.Reflection.Assembly]::LoadWithPartialName($SsisNamespace) | Out-Null 

$SqlConnectionstring = "Data Source=$SsisServer;Initial Catalog=master;Integrated Security=SSPI;" 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnectionstring 

# Create the Integration Services object 
$IntegrationServices = New-Object "$SsisNamespace`.IntegrationServices" $SqlConnection 

$Catalog = $IntegrationServices.Catalogs["SSISDB"] 
$oFolder = $Catalog.Folders[$Folder] 
$oProject = $oFolder.Projects[$ProjectName] 
$ISPAC = $oProject.GetProjectBytes() 
[System.IO.File]::WriteAllBytes(($DownloadFolder + "\" + $oProject.Name + ".ispac"),$ISPAC) 

如果你的包存储在MSDB,下面的代码,从Jamie Thomson,将下载所有包到本地存储。

Param($SQLInstance = "localhost") 

#####Add all the SQL goodies (including Invoke-Sqlcmd)##### 
add-pssnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue 
add-pssnapin sqlservercmdletsnapin100 -ErrorAction SilentlyContinue 
cls 

$ssisSQL = "WITH cte AS (
     SELECT cast(foldername as varchar(max)) as folderpath, folderid 
     FROM msdb..sysssispackagefolders 
     WHERE parentfolderid = '00000000-0000-0000-0000-000000000000' 
     UNION ALL 
     SELECT cast(c.folderpath + '\' + f.foldername as varchar(max)), f.folderid 
     FROM msdb..sysssispackagefolders f 
     INNER JOIN cte c  ON c.folderid = f.parentfolderid 
    ) 
    SELECT c.folderpath,p.name,CAST(CAST(packagedata AS VARBINARY(MAX)) AS VARCHAR(MAX)) as pkg 
    FROM cte c 
    INNER JOIN msdb..sysssispackages p ON c.folderid = p.folderid 
    WHERE c.folderpath NOT LIKE 'Data Collector%'" 

$Packages = Invoke-Sqlcmd -MaxCharLength 10000000 -ServerInstance $SQLInstance -Query $ssisSQL 

Foreach ($pkg in $Packages) 
{ 
    $pkgName = $Pkg.name 
    $folderPath = $Pkg.folderpath 
    $fullfolderPath = "c:\temp\$folderPath\" 
    if(!(test-path -path $fullfolderPath)) 
    { 
     mkdir $fullfolderPath | Out-Null 
    } 
    $pkg.pkg | Out-File -Force -encoding ascii -FilePath "$fullfolderPath\$pkgName.dtsx" 
} 
相关问题