使用 PowerShell 将 SQL varbinary 内容转换为 .pkg 文件
Convert SQL varbinary content into .pkg file using PowerShell
我使用 SQL 服务器,我有一个名为 [dbo].[TemplatePackageContent]
的 SQL table,它只有两个字段:
[TemplatePackageContentId] [uniqueidentifier] NOT NULL,
[Content] [varbinary](max) NULL
我想创建从 table 中读取全部内容的 PowerShell 脚本,并且对于每一行,它将在给定目录中生成一个文件,格式为 {TemplatePackageContentId}.pkg
基于 Content
字段。
到目前为止,我已经设法阅读了 table:
的全部内容
param(
[string] $dataSource = "(localdb)\mssqlLocalDb",
[string] $database = "Hda_tenancy1",
[string] $sqlCommand = $("SELECT * FROM TemplatePackageContent")
)
$connectionString = "Data Source=$dataSource; " +
"Integrated Security=SSPI; " +
"Initial Catalog=$database"
$connection = new-object system.data.SqlClient.SQLConnection($connectionString)
$command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
$connection.Open()
$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
$dataset = New-Object System.Data.DataSet
$adapter.Fill($dataSet) | Out-Null
$connection.Close()
$dataSet.Tables
现在我想对接收到的结果进行上述转换,大概循环遍历每一行。
我发现 this article 解决了 c# 中的类似问题,我正在考虑使用那里的一些逻辑并尝试将其转换为 PowerShell 脚本。
将所有 "Content" 字段转换为 .pkg 格式文件的最佳方法是什么?我应该使用什么库或什么方法?
有任何想法吗?
干杯
我最终得到了这个解决方案:
param(
[string] $dataSource = "(localdb)\mssqlLocalDb",
[string] $database = "Hda_tenancy1",
[string] $templatePath = "C:\dev\hubadvance\Seeding\Templates\"
)
$sqlCommand = $("SELECT * FROM TemplatePackageContent");
$connection = new-object System.Data.SqlClient.SQLConnection("Data Source=$dataSource;Integrated Security=SSPI;Initial Catalog=$database");
$cmd = new-object System.Data.SqlClient.SqlCommand($sqlCommand, $connection);
$connection.Open();
$reader = $cmd.ExecuteReader();
$results = @();
while ($reader.Read())
{
$row = @{}
for ($i = 0; $i -lt $reader.FieldCount; $i++)
{
$row[$reader.GetName($i)] = $reader.GetValue($i);
}
$results += new-object psobject -property $row;
}
$connection.Close();
foreach ($row in $results)
{
Write-Host $row.TemplatePackageContentId;
$path = $templatePath + $row.TemplatePackageContentId + ".pkg";
[System.IO.File]::AppendAllText($path, $row.Content);
}
我使用 SQL 服务器,我有一个名为 [dbo].[TemplatePackageContent]
的 SQL table,它只有两个字段:
[TemplatePackageContentId] [uniqueidentifier] NOT NULL,
[Content] [varbinary](max) NULL
我想创建从 table 中读取全部内容的 PowerShell 脚本,并且对于每一行,它将在给定目录中生成一个文件,格式为 {TemplatePackageContentId}.pkg
基于 Content
字段。
到目前为止,我已经设法阅读了 table:
的全部内容param(
[string] $dataSource = "(localdb)\mssqlLocalDb",
[string] $database = "Hda_tenancy1",
[string] $sqlCommand = $("SELECT * FROM TemplatePackageContent")
)
$connectionString = "Data Source=$dataSource; " +
"Integrated Security=SSPI; " +
"Initial Catalog=$database"
$connection = new-object system.data.SqlClient.SQLConnection($connectionString)
$command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
$connection.Open()
$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
$dataset = New-Object System.Data.DataSet
$adapter.Fill($dataSet) | Out-Null
$connection.Close()
$dataSet.Tables
现在我想对接收到的结果进行上述转换,大概循环遍历每一行。
我发现 this article 解决了 c# 中的类似问题,我正在考虑使用那里的一些逻辑并尝试将其转换为 PowerShell 脚本。
将所有 "Content" 字段转换为 .pkg 格式文件的最佳方法是什么?我应该使用什么库或什么方法? 有任何想法吗? 干杯
我最终得到了这个解决方案:
param(
[string] $dataSource = "(localdb)\mssqlLocalDb",
[string] $database = "Hda_tenancy1",
[string] $templatePath = "C:\dev\hubadvance\Seeding\Templates\"
)
$sqlCommand = $("SELECT * FROM TemplatePackageContent");
$connection = new-object System.Data.SqlClient.SQLConnection("Data Source=$dataSource;Integrated Security=SSPI;Initial Catalog=$database");
$cmd = new-object System.Data.SqlClient.SqlCommand($sqlCommand, $connection);
$connection.Open();
$reader = $cmd.ExecuteReader();
$results = @();
while ($reader.Read())
{
$row = @{}
for ($i = 0; $i -lt $reader.FieldCount; $i++)
{
$row[$reader.GetName($i)] = $reader.GetValue($i);
}
$results += new-object psobject -property $row;
}
$connection.Close();
foreach ($row in $results)
{
Write-Host $row.TemplatePackageContentId;
$path = $templatePath + $row.TemplatePackageContentId + ".pkg";
[System.IO.File]::AppendAllText($path, $row.Content);
}