![]() |
.
Добрый день. С помощью Invoke-Sqlcmd пытаюсь сделать, чтобы скрипт выполнял запросы сразу на нескольких SQL базах. Вот пример кода. Скрипт сохраняет в переменные строки с двух текстовых файлов.
Код:
$SQLNames = Get-Content -Path C:\komp.txt |
Судя по приведенному коду на каждом из SQLName выполнятся ВСЕ запросы из bd.txt (или так и нужно было?)
Т.к. вывод идет в Out-GridView после выполнения запросов цикл должен остановиться и показать табличку с выводом. После закрытия таблички выполнится еще один кусок цикла. (насчет этого не уверен, не на чем протестировать). |
Цитата:
|
Я бы для начала отладил выполнение запросов к нескольким базам на одной машине.
А чтобы хорошо и быстро работали запросы к нескольким серверам одновременно, рекомендую Invoke-Command. |
Цитата:
|
Цитата:
Цитата:
|
valerarom2021, нужен не пример строк, а кодировка текста, наличие/отсутствие BOM и вид конца строк.
|
Вложений: 1
Цитата:
|
Цитата:
Первое соединение компьютер, база проходит правильно. Второй раз первая строка компьютер не меняется, только база. |
Invoke-Command - это не замена Invoke-Sqlcmd, а параллельный запуск команд сразу на нескольких машинах. Ссылочку почитайте.
|
Цитата:
|
Вложений: 1
Цитата:
|
valerarom2021, я прогнал этот код:
Скрытый текст
Код:
$SQLNames = Get-Content -Path 'C:\Мои проекты\0346\1\komp.txt' и закономерно убедился, что с перебором там всё в порядке. Вы выкладывали весь Ваш код? |
Цитата:
Код:
$objbutton_Ok.Add_Click({ соединено с R67-356786-N DB354657. Write-Host показывает что в $SQLName парсит только первую строку, после этого база меняется, а имя пк нет. |
Цитата:
Начните с составления словесного алгоритма того, что необходимо получить... |
Цитата:
Цитата:
|
Цитата:
Цитата:
Если есть необходимость получить помощь, не надо секретничать и выдавать информацию по чайной ложке в неделю. Конфиденциальную информацию можете заменить чем-нибудь или затереть... Сделайте скриншоты результата работы Вашего скрипта, со всеми ошибками, в том числе. И сам скрипт покажите целиком, чтобы было понятно, что у вас там происходит. Иначе никак. |
Цитата:
корректировка кода
Код:
... и запустим этот код: То бишь, на каждую итерацию родительского цикла, приходится по одному полному проходу вложенного цикла, что собственно, в коде и записано. Вывод: Если у Вас работает не так, значит проблема со строкой запуска командлета Invoke-Sqlcmd, проверяйте её. |
Зачем этот графический интерфейс, занимающий миллион строк кода, когда можно было просто пару параметров сделать?
|
DJ Mogarych, ну, например, не умеет/не любит человек в командную строку.
|
Цитата:
|
Можно организовать общение с пользователем через командную строку, задавая вопросы или предоставляя выбор из пунктов. Это сильно сэкономит объём кода и силы для его написания.
|
Цитата:
|
Сколько там баз?
Уберите вложенный foreach с базами и сделайте несколько строк Invoke-Sqlcmd, прописав там имена баз в явном виде. Будет так работать? |
Цитата:
Именно, для такого случая, рекомендовал: Цитата:
Напишите, что в итоге требуется получить. Составьте вручную результирующие строки, которые покажут, как именно должен осуществляться доступ к базам. |
Цитата:
Цитата:
Цитата:
Цитата:
|
Сами по себе вложенные циклы работают нормально.
Код:
$servers = 1..5 |% {"server$($_.ToString("00"))"} Возможно, следовало бы базы перечислять в самом запросе и делать один запрос на хост, чем заниматься ковровой бомбардировкой хоста 50-ю запросами. |
Цитата:
|
Цитата:
Вам же не отказывают в помощи, но любая задача решается быстрее, если правильно составить её условия... Цитата:
А вот в цикле происходит разбор того, что записано в массиве. Ещё раз: циклы отрабатывают ровно так, как и должны. Просто Вы недопонимаете, что содержат переменные в каждой итерации каждого цикла. |
Цитата:
Get-Content сохраняет строки в массив $SQLNames. Дальше с коллекцией работает foreach. В данном случает в массиве только первая строка из файла komp.txt, а их там 50. Получается имя компьютера не меняется, только обновляется переменная $SQLBDs. В итоге скрипт на одном компьютере пытается соединиться с базами со списка bd.txt Надеюсь сейчас понятно. Объяснил. Как мне сделать чтобы массивы $SQLNames, $SQLBDs совпадали так ? например: R76-356785-N DB352785, следующее R76-356787-N DB352787 Либо используя один текстовый файл считывать сразу R76-356785-N DB352785 |
Цитата:
Цитата:
1. На каждый компьютер должна приходиться одна база 2. Порядок следования компьютеров должен полностью совпадать с порядком следования соответствующих компьютерам баз. т.е. в файлах должно быть записано так: Цитата:
Код:
for ($i=0;$i -lt $SQLNames.length;$i++){ Цитата:
Код:
$array = Import-Csv list.csv |
Цитата:
YuS_2, снимаю шляпу за настойчивость! |
Цитата:
|
Цитата:
|
Добрый день. Пытаюсь улучшить скрипт. Добавить в скрипт runspace.
Код:
function runspace { |
Цитата:
Цитата:
Почитайте несколько частей на предмет изучения ранспейсов |
Цитата:
|
Цитата:
Код:
function SQLALLDB { |
Код:
$Code = { |
Цитата:
Цитата:
Начните от простого к сложному... создайте небольшой пул ранспейсов с одним или двумя параметрами без циклов внутри, запустите их, протестируйте и потом уже усложняйте. Здесь, у Вас я вижу, что пытаетесь запустить, в каждом пространстве из пула, полный цикл размерностью длины базы. А параметры пытаетесь передать изнутри скриптблока... естественно, так ничего не будет работать. Например, попробуйте выполнить в консоли это: Код:
if ($Parameters){rv -n Parameters} Код:
if ($Parameters){rv -n Parameters} |
Время: 23:43. |
Время: 23:43.
© OSzone.net 2001-