Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - .

Ответить
Настройки темы
PowerShell - .

Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: valerarom2021
Дата: 17-09-2021
Добрый день. С помощью Invoke-Sqlcmd пытаюсь сделать, чтобы скрипт выполнял запросы сразу на нескольких SQL базах. Вот пример кода. Скрипт сохраняет в переменные строки с двух текстовых файлов.
Код: Выделить весь код
 $SQLNames = Get-Content -Path C:\komp.txt
 $SQLBDs = Get-Content -Path C:\bd.txt

foreach($SQLName in $SQLNames)
   {
       foreach($SQLBD in $SQLBDs) { 
   Invoke-Sqlcmd -ServerInstance $SQLName -Username $Username -Password $Password -Database $SQLBD  -Query $query  -Verbose | Out-GridView 
      } 
   }
Проблема заключается в том, что $SQLName сохраняет только первую строку из файла komp.txt и пытается на одном и том же компьютере подключиться к базе из переменной $SQLBD.

Отправлено: 15:31, 27-07-2021

 

Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Зачем этот графический интерфейс, занимающий миллион строк кода, когда можно было просто пару параметров сделать? »
Скриптом не только я буду пользоваться.

Отправлено: 08:57, 01-08-2021 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6676
Благодарности: 1559

Профиль | Отправить PM | Цитировать


Можно организовать общение с пользователем через командную строку, задавая вопросы или предоставляя выбор из пунктов. Это сильно сэкономит объём кода и силы для его написания.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 09:12, 01-08-2021 | #22


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Если у Вас работает не так, значит проблема со строкой запуска командлета Invoke-Sqlcmd, проверяйте её. »
Вы ведете на скрине во второй строке цифры в имени компьютера и базы должны совпадать. У вас меняется только название базы. В этом проблема.

Отправлено: 09:18, 02-08-2021 | #23


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6676
Благодарности: 1559

Профиль | Отправить PM | Цитировать


Сколько там баз?
Уберите вложенный foreach с базами и сделайте несколько строк Invoke-Sqlcmd, прописав там имена баз в явном виде.

Будет так работать?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 09:40, 02-08-2021 | #24


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1231
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата valerarom2021:
Вы ведете на скрине во второй строке цифры в имени компьютера и базы должны совпадать. У вас меняется только название базы. В этом проблема. »
Следовательно, представления о том, как работают циклы, у Вас нет.
Именно, для такого случая, рекомендовал:
Цитата YuS_2:
Начните с составления словесного алгоритма того, что необходимо получить... »
Ибо то, что находится в шапке топика, это не словесный алгоритм, а код (полного понимания которого у Вас нет, видимо кто-то вам его написал) с краткими комментариями, которые ничего не объясняют.
Напишите, что в итоге требуется получить. Составьте вручную результирующие строки, которые покажут, как именно должен осуществляться доступ к базам.

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:27, 02-08-2021 | #25


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Сколько там баз? »
50 баз
Цитата DJ Mogarych:
Будет так работать? »
Так работает.

Цитата YuS_2:
Ибо то, что находится в шапке топика, это не словесный алгоритм, а код (полного понимания которого у Вас нет, видимо кто-то вам его написал) с краткими комментариями, которые ничего не объясняют.
Напишите, что в итоге требуется получить. Составьте вручную результирующие строки, которые покажут, как именно должен осуществляться доступ к базам. »
Этот код я сам написал.

Цитата YuS_2:
Следовательно, представления о том, как работают циклы, у Вас нет. »
Я написал много скриптов используя foreach. Все они работают. Здесь проблема в том, что оба цикла вместе не корректно работают.

Отправлено: 10:36, 02-08-2021 | #26


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6676
Благодарности: 1559

Профиль | Отправить PM | Цитировать


Сами по себе вложенные циклы работают нормально.

Код: Выделить весь код
$servers = 1..5 |% {"server$($_.ToString("00"))"}
$dbs = 1..3 |% {"db$($_.ToString("00"))"}

foreach ($server in $servers) {
    foreach ($db in $dbs) {
    "Invoke-Sqlcmd -server $server -database $db"
    }
}
Invoke-Sqlcmd -server server01 -database db01
Invoke-Sqlcmd -server server01 -database db02
Invoke-Sqlcmd -server server01 -database db03
Invoke-Sqlcmd -server server02 -database db01
Invoke-Sqlcmd -server server02 -database db02
Invoke-Sqlcmd -server server02 -database db03
Invoke-Sqlcmd -server server03 -database db01
Invoke-Sqlcmd -server server03 -database db02
Invoke-Sqlcmd -server server03 -database db03
Invoke-Sqlcmd -server server04 -database db01
Invoke-Sqlcmd -server server04 -database db02
Invoke-Sqlcmd -server server04 -database db03
Invoke-Sqlcmd -server server05 -database db01
Invoke-Sqlcmd -server server05 -database db02
Invoke-Sqlcmd -server server05 -database db03
Выведите команды с помощью echo на экран, чтобы проверить, правильно ли подставляются переменные.

Возможно, следовало бы базы перечислять в самом запросе и делать один запрос на хост, чем заниматься ковровой бомбардировкой хоста 50-ю запросами.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:39, 02-08-2021 | #27


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Выведите команды с помощью echo на экран, чтобы проверить, правильно ли подставляются переменные. »
$SQLName парсит только первую строку из файла komp.txt, foreach($SQLName in $SQLNames) не отрабатывает.

Отправлено: 11:55, 02-08-2021 | #28


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1231
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата valerarom2021:
Здесь проблема в том, что оба цикла вместе не корректно работают. »
О том и речь, что циклы работают именно так, как они и должны работать, т.е. как раз, корректно. Другое дело, что Вы их используете не так, как необходимо для достижения результата, который Вам требуется. А вот то, что именно требуется, непонятно тем, у кого Вы попросили помощь... либо объясните, либо подождите, возможно, у кого-то обострятся экстрасенсорные способности.
Вам же не отказывают в помощи, но любая задача решается быстрее, если правильно составить её условия...

Цитата valerarom2021:
$SQLName парсит только первую строку из файла komp.txt »
Переменная ничего не парсит. В переменной содержится массив того, что считывает из файла командлет get-content, так записано в Вашем коде.
А вот в цикле происходит разбор того, что записано в массиве. Ещё раз: циклы отрабатывают ровно так, как и должны. Просто Вы недопонимаете, что содержат переменные в каждой итерации каждого цикла.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 02-08-2021 в 12:02.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:56, 02-08-2021 | #29


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Переменная ничего не парсит. В переменной содержится массив того, что считывает из файла командлет get-content, так записано в Вашем коде.
А вот в цикле происходит разбор того, что записано в массиве. Ещё раз: циклы отрабатывают ровно так, как и должны. Просто Вы недопонимаете, что содержат переменные в каждой итерации каждого цикла. »
$SQLNames = Get-Content -Path C:\komp.txt
Get-Content сохраняет строки в массив $SQLNames. Дальше с коллекцией работает foreach. В данном случает в массиве только первая строка из файла komp.txt, а их там 50.
Получается имя компьютера не меняется, только обновляется переменная $SQLBDs. В итоге скрипт на одном компьютере пытается соединиться с базами со списка bd.txt Надеюсь сейчас понятно. Объяснил.

Как мне сделать чтобы массивы $SQLNames, $SQLBDs совпадали так ? например: R76-356785-N DB352785, следующее R76-356787-N DB352787
Либо используя один текстовый файл считывать сразу R76-356785-N DB352785

Последний раз редактировалось valerarom2021, 02-08-2021 в 12:22.


Отправлено: 12:14, 02-08-2021 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - .

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [блог] Игнорирование проверки сертификата для Invoke-WebRequest/Invoke-RestMethod Kazun Скриптовые языки администрирования Windows 0 07-09-2017 05:30
PowerShell - Invoke-WebRequest NoProxy Elven Скриптовые языки администрирования Windows 2 18-05-2017 16:43
PowerShell - [блог] Отправка Post запроса используя Invoke-WebRequest Kazun Скриптовые языки администрирования Windows 0 04-09-2016 16:30
C/C++ - [решено] C# Invoke(), работает не как надо, почему? Barit Программирование и базы данных 1 21-04-2012 15:02
PowerShell - [блог] Invoke-SQL Xaegr Скриптовые языки администрирования Windows 0 17-08-2010 00:30




 
Переход