用于多个服务器的 Powershell For Loop - 获取 SSAS 连接字符串详细信息
Powershell For Loop for multiple servers - to get SSAS connection string details
我对 powershell 脚本还很陌生。我正在尝试获取多个服务器的 SSAS 表格模型连接字符串详细信息。我的代码 return 仅适用于单个服务器。如何修改代码以通过多个服务器?
$servername = "servername1"
# Connect SSAS Server
$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($servername)
$DSTable = @();
foreach ( $db in $server.databases)
{
$dbname = $db.Name
$Srver = $db.ParentServer
foreach ( $ds in $db.Model.DataSources)
{
$hash = @
{
"Server" = $Srver;
"Model_Name" = $dbname ;
"Datasource_Name" = $ds.Name ;
"ConnectionString" = $ds.ConnectionString ;
"ImpersonationMode" = $ds.ImpersonationMode;
"Impersonation_Account" = $ds.Account;
}
$row = New-Object psobject -Property $hash
$DSTable += $row
}
}
如评论所述,您可以将您的代码包围在另一个 foreach
循环中。
使用数组连接 +=
是一个坏主意,因为在每次添加时,整个数组都需要在内存中重新创建,因此既耗时又耗内存。
最好的办法是让 PowerShell 完成收集数据的繁重工作:
$allServers = 'server01','server02','server03' # etc. an array of servernames
# loop through the servers array and collect the utput in variable $result
$result = foreach($servername in $allServers) {
# Connect SSAS Server
$server = New-Object Microsoft.AnalysisServices.Server
$server.Connect($servername)
foreach ( $db in $server.databases) {
foreach ( $ds in $db.Model.DataSources) {
# output an object with the desired properties
[PsCustomObject]@{
Server = $db.ParentServer
Model_Name = $db.Name
Datasource_Name = $ds.Name
ConnectionString = $ds.ConnectionString
ImpersonationMode = $ds.ImpersonationMode
Impersonation_Account = $ds.Account
}
}
}
}
# output on screen
$result | Out-GridView -Title 'SSAS connection string details'
# output to a CSV file (change the path and filename here of course..)
$result | Export-Csv -Path 'D:\Test\MySSAS_Connections.csv' -UseCulture -NoTypeInformation
以上使用参数 -UseCulture
因为用于 CSV 文件的分隔符与 您的 机器在双击和Excel 开幕。没有它,使用默认逗号
我对 powershell 脚本还很陌生。我正在尝试获取多个服务器的 SSAS 表格模型连接字符串详细信息。我的代码 return 仅适用于单个服务器。如何修改代码以通过多个服务器?
$servername = "servername1"
# Connect SSAS Server
$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($servername)
$DSTable = @();
foreach ( $db in $server.databases)
{
$dbname = $db.Name
$Srver = $db.ParentServer
foreach ( $ds in $db.Model.DataSources)
{
$hash = @
{
"Server" = $Srver;
"Model_Name" = $dbname ;
"Datasource_Name" = $ds.Name ;
"ConnectionString" = $ds.ConnectionString ;
"ImpersonationMode" = $ds.ImpersonationMode;
"Impersonation_Account" = $ds.Account;
}
$row = New-Object psobject -Property $hash
$DSTable += $row
}
}
如评论所述,您可以将您的代码包围在另一个 foreach
循环中。
使用数组连接 +=
是一个坏主意,因为在每次添加时,整个数组都需要在内存中重新创建,因此既耗时又耗内存。
最好的办法是让 PowerShell 完成收集数据的繁重工作:
$allServers = 'server01','server02','server03' # etc. an array of servernames
# loop through the servers array and collect the utput in variable $result
$result = foreach($servername in $allServers) {
# Connect SSAS Server
$server = New-Object Microsoft.AnalysisServices.Server
$server.Connect($servername)
foreach ( $db in $server.databases) {
foreach ( $ds in $db.Model.DataSources) {
# output an object with the desired properties
[PsCustomObject]@{
Server = $db.ParentServer
Model_Name = $db.Name
Datasource_Name = $ds.Name
ConnectionString = $ds.ConnectionString
ImpersonationMode = $ds.ImpersonationMode
Impersonation_Account = $ds.Account
}
}
}
}
# output on screen
$result | Out-GridView -Title 'SSAS connection string details'
# output to a CSV file (change the path and filename here of course..)
$result | Export-Csv -Path 'D:\Test\MySSAS_Connections.csv' -UseCulture -NoTypeInformation
以上使用参数 -UseCulture
因为用于 CSV 文件的分隔符与 您的 机器在双击和Excel 开幕。没有它,使用默认逗号