База данных запросов Powershell и сохранение результатов в переменной - PullRequest
0 голосов
/ 22 мая 2018

Я написал скрипт powershell для запроса базы данных, чтобы получить список имен серверов.Затем я сохраняю результаты в переменной, чтобы пройти через каждый сервер для поиска службы, выполнив что-то вроде: foreach ($server in $servers).У меня нет проблем с сохранением результатов в переменной, но когда я делаю оператор foreach, он не позволяет мне получить имя сервера 1 на 1 должным образом.

Если я вручную введу имена серверов, например $servers = (server, server2,server3), то forEach будет работать.Как правильно это сделать?

Обновлено: ниже приведен скрипт

$SQLServer= 'sourceServer'
$Database = 'DatabaseNameHere'

Создание функции SQL-запроса

Function SQL_Query ($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = 
"Server=$SQLServer;Database=$Database;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 
$DataSet.Tables[0]  
}

Использование этой функции

$list=SQL_Query "Select ServerName From Server_Inventory Where Status = 'A' " 

Проверить возвращенный список серверов

$list

Я бы хотел пройти через каждый сервер и посмотреть, какие серверы установлены на каждом сервере

$output= Foreach ($server in $list) {
$output=Get-DbaSqlService -ComputerName $server | Where-Object 
{$_.ServiceType -in ('SSIS','Agent','Engine','SSRS','FullText')} 
}
$output | Out-GridView -Title "View all SQL Services"

1 Ответ

0 голосов
/ 30 мая 2018

$DataSet.Tables[0] - это объект со столбцами из запроса в качестве свойств.В вашем случае $list будет объектом PowerShell со свойством ServerName.

Раствор 1 При вызове Get-DbaSqlService -ComputerName $server вы передадите один объект целиком, где вы хотите указать только имя, при изменении этого значения на Get-DbaSqlService -ComputerName $server.ServerName вы передадите только значение свойства ServerName.

Решение 2 Поскольку вам нужно только изучить свойство Servername, вы уже можете расширить его, чтобы $list представляло то, что вы ожидаете.Поэтому вы должны добавить Select-Object -ExpandProperty ServerName, где вы определяете $list.

Так что

$list = SQL_Query "Select ServerName From Server_Inventory Where Status = 'A' " 

становится

$list = SQL_Query "Select ServerName From Server_Inventory Where Status = 'A' " | Select-Object -ExpandProperty ServerName

Добавление Переменная $output перезаписывается в каждом цикле.Результаты для каждого сервера должны быть добавлены к выходной переменной.

$output = @()
Foreach ($server in $list) {
   $output += Get-DbaSqlService -ComputerName $server | Where-Object {$_.ServiceType -in ('SSIS','Agent','Engine','SSRS','FullText')} 
}
$output | Out-GridView -Title "View all SQL Services"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...