说我有2台服务器,分别是服务器1和服务器2。
每个服务器中有x个数据库,每个数据库都与全局数据库建立连接。
服务器1具有数据库1,数据表2,数据库3。
服务器2具有数据库4,数据库5
我们将有2个文件,一个文件包含服务器,另一个文件包含“数据库”
然后循环将是:
Import-Module SqlServer
foreach ($server in $servers_file)
{
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$server")
foreach ($database in $databases_file)
{
$database = $Analysis_Server.Databases.FindByName($database)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
这里的问题是此循环不考虑服务器的数据库所属位置。
例如,如果我的数据库文件为:
数据库1
数据库2
数据库3
数据库4
数据库5
如何使该循环知道当server1-3中的database1-3完成时它必须退出内部循环,现在您必须继续进行外循环以连接database4和5的server2。
ConnectionInfo类:https://docs.microsoft.com/it-it/dotnet/api/microsoft.analysisservices.connectioninfo?view=sqlserver-2016
答案 0 :(得分:1)
我建议您创建一个哈希表,在其中将数据库值分配给每个服务器。
$h=@{'server1'=( 'database1','database2','database3');'server2'=( 'database4','database5')}
然后您的循环变为:
foreach($key in $h.keys){
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$key")
foreach($value in $h[$key])
{
write-output "$key - has db $value"
$database = $Analysis_Server.Databases.FindByName($database)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
答案 1 :(得分:1)
看到您对要使用csv文件填充哈希表的最后评论,可以执行以下操作:
假设您的CSV看起来像这样
-c 4
然后您可以使用"Server","Database"
"server1","database1"
"server2","database4"
"server1","database2"
"server1","database3"
"server2","database5"
读取它,并像这样从中创建一个哈希值
Import-Csv
根据您的PowerShell版本(我认为您至少需要5.1),您可以通过以下操作简化前一个版本:
$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | Group-Object Server | ForEach-Object {
$db = @()
foreach ($item in $_.Group) {
$db += $item.Database
}
$h += @{$($_.Name) = $db}
}
接下来,您可以使用thom schumacher所述的循环:
$h = @{}
Import-Csv 'D:\Code\PowerShell\StackOverflow\Databases.csv' | Group-Object Server | ForEach-Object {
$h += @{$($_.Name) = $_.Group.Database}
}
修改
从您的评论中,我收集到您的csv文件,如下所示:
foreach($server in $h.Keys){
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$server")
foreach($db in $h[$server]) {
write-output "$server - has db $db"
$database = $Analysis_Server.Databases.FindByName($db)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
在这种情况下,您可以像这样将其读取到Hashtable中:
"Server","Database"
"server1", "database1, database2, database3"
"server2","database4, database5"
如果您的CSV文件没有具有上述标题,请使用$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | ForEach-Object {
$h += @{$($_.Server) = ($_.Database -split '\s*,\s*') }
}
cmdlet上的-Header
开关为这些列提供一个我们可以使用的名称,如下所示:
Import-Csv