Генерация файла конфигурации Dynami c с помощью powershell - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать файл конфигурации для приложения мониторинга для всех наших SQL серверов. Для этого мне нужно добавить все детали экземпляра сервера в файл конфигурации (т.е. один файл будет создан для каждого сервера, а не экземпляра). Таким образом, даже если сервер имеет несколько экземпляров, у него будет только один файл конфигурации с подробностями обо всех упомянутых в нем экземплярах. Для сервера с единственным экземпляром это не проблема. Мне нужна помощь на сервере с несколькими экземплярами. Например, если server1 имеет два экземпляра Instance1 и 2, тогда файл конфигурации должен выглядеть, как показано ниже, и экспортироваться в текстовый файл. Точно так же для сервера с одним экземпляром будет только 1 строка без запятой в конце, которая будет экспортирована в текстовый файл.

"Server=Server1\Instance1;Port=50001;User ID:sqltest;password:****",
"Server=Server1\Instance2;Port=50002;User ID:sqltest;password:****"

Я получаю все данные экземпляра сервера из SQL базы данных сервера, хранящейся в формате ServerName, InstanceName, PortName. Может ли кто-нибудь помочь мне, как мне добиться этого с помощью Powershell? Спасибо!

Я уже пробовал что-то вроде ниже. Но у него есть несколько проблем, таких как неправильный номер порта, добавление вывода в новую строку каждый раз, когда есть несколько экземпляров, отсутствие запятой для последнего экземпляра и создание файла для каждого сервера, а не для каждого экземпляра.

$serverlist = Invoke-Sqlcmd -Query "SELECT servername,instancename,portname from sqlmonitor" -ServerInstance "MainInstance"$textoutput = "This is a test."
Foreach {$server in $serverlist.servername}
{
    $textoutput += "`nServer=$Server;Port=$serverlist.portname;User ID:sqltest;password:****"}
$textoutput | Out-File "C:\temp\$server_config.txt"


Sample data from sqlmonitor table:

servername,instancename,portname
    server1,inst1,50001
    server2,inst1,50001
    server2,inst2,50002

Я все еще нахожусь на начальной стадии изучения PS и знаю, что в моем коде много проблем. :)

1 Ответ

1 голос
/ 05 августа 2020

Вы можете попробовать что-то вроде:

# Create an array to hold some new objects
$arrServers = @()

# Run through your serverlist
foreach ($server in $serverlist.servername){
  # if it is a server you have already added to your new array, then just add the text to the output
  if ($arrServers.servername -contains $server ) {
    # There is probably an easier way to do this, but this just locates the position in the array where $server is found, then updates text for that location
    $arrServers[([array]::indexof($($arrServers.servername),$server))].textoutput += ",`nServer=$Server;Port=$serverlist.portname;User ID:sqltest;password:****"
  # otherwise create a new object to store your servername and textoutput
  } else {      
    $obj = New-Object System.Object
    Add-Member -InputObject $obj -NotePropertyName "servername" -NotePropertyValue $server
    Add-Member -InputObject $obj -NotePropertyName "textoutput" -NotePropertyValue "`nServer=$Server;Port=$serverlist.portname;User ID:sqltest;password:****"
    $arrServers += $obj
    $obj = $null
  }
}

# All done, so now we run out a file for each server
$arrServers | foreach {Out-File "C:\temp\$($_.servername)_config.txt} 

В качестве альтернативы вы могли бы, вероятно, добавить ORDER BY servername ASC к своему SQL, чтобы ваши экземпляры сервера были сгруппированы вместе, а затем запустить проверку каждого l oop чтобы проверить, совпадает ли текущее имя сервера с предыдущим перед запуском файла, но это кажется более громоздким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...