@ Tim Mylott,
Вся проблема возникла из-за скрипта, сгенерированного из моей производственной системы из команды Powershell DBATools 'Export-DbaLogin.
Выходной скрипт из этого инструмента был похож наВаш первый файл text.txt, в котором он запускает слепые команды CREATE USER без предварительного тестирования, чтобы проверить, существует ли пользователь.
Это было недостаточно для наших нужд (наша производственная БД и система работали на лет и теперь повсюду в нем есть старый, плохой «мусор», поэтому я взял вывод сценария в Notepad ++ и добавил логику проверки IF NOT EXIST ... (подробности см. в сценарии в исходном вопросе)) в качестве префикса к командам CREATE USER в сценарии с глобальным поиском и заменой. Только мне пришлось ввести @@ Placeholder @@ для имени пользователя в предложении SELECT WHERE для теста.
В результате у меня остался сценарий, в котором мне пришлось заменить текст @@ Placeholder @@ нафактические строки имени пользователя в существующем тексте CREATE USER в той же строке в файле скрипта.
В NP ++, к которому вы меня привели, было решение использовать Regex в поиске NP ++, чтобы выбрать строку идентификатора пользователя вта же строка. Оттуда было довольно легко и просто использовать запись макросов NP ++ для автоматизации поиска и замены.
Во-первых, я нашел в сети регулярное выражение для выбора текста между первой подходящей парой [] s, а именно: (? <= [). +? (? =]) Запись сценария NP ++ была в основномthis (начать запись макроса): </p>
Find: @@ PlaceHolder @@ (поиск без регулярных выражений) [NP ++ находит следующую строку для изменения] [Home] (чтобы найти начало строки) Find: (? <= [). +? (? =]) (поиск по регулярному выражению) [NP ++ выбирает строку UserID в части строки CREATE USER) [Ctrl + C] (копировать строку UserID в буфер обмена после закрытия диалога поиска) [Home] (чтобы снова найти начало строки) Find: @@ PlaceHolder @@ (поиск без регулярных выражений) [NP ++ находит текст @@ Placeholder @@ в текущей строке и выделяет его] [Ctrl + V] (вставитьв строке «Идентификатор пользователя из буфера обмена» (при этом курсор остается в том же месте, где исправленная команда может быть визуально подтверждена как правильная) </p>
В NP ++ Используйте кнопку «Воспроизвести макрос», чтобы вручную воспроизвести этот записанный макрос несколько разчтобы убедиться, что макрос имеет право ... Затем, используйте воспроизведение несколько раз (пока не достигнут конец файла) и вуаля! Файл скрипта полностью исправлен.
[Примечание: у DBATools GitHub теперь есть 2 сообщения об ошибках / запросы на добавление этой логики IF NOT EXISTS в строки CREATE USER в сгенерированном скрипте, поэтому эта проблема в конечном итоге исчезнетпрочь, но пока ... есть хотя бы одно разумное решение с использованием NotePad ++.]
Итак, спасибо, Тим, за то, что вы дали мне быстрый ответ.
Это сказало, хотя, ваша часть ответа Powershell была неправильной, так что никаких баллов нет! (он делал неправильно и вставлял в сценарий "@@ Placeholder @@", а не заменял существующую строку "@@ PlaceHolder @@" в сценарии фактическими строками UserID, уже находящимися в сценарии.
Повторюсь, проблема была (логически) в следующем:
-- FROM THIS:
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUser2]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUser3]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUser5]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUser1]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUser7]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUser8]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUserA]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUserB]...
IF NOT EXISTS (SELECT ... WHERE name = '@@PlaceHolder@@') CREATE USER [MyDomain\AUserC]...
-- TO THIS:
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUser2') CREATE USER [MyDomain\AUser2]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUser3') CREATE USER [MyDomain\AUser3]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUser5') CREATE USER [MyDomain\AUser5]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUser1') CREATE USER [MyDomain\AUser1]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUser7') CREATE USER [MyDomain\AUser7]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUser8') CREATE USER [MyDomain\AUser8]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUserA') CREATE USER [MyDomain\AUserA]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUserB') CREATE USER [MyDomain\AUserB]...
IF NOT EXISTS (SELECT ... WHERE name = 'MyDomain\AUserC') CREATE USER [MyDomain\AUserC]…
Пересмотренный сценарий из отличного начала Тима (версия 2): -)
#create new output file
new-item "C:\temp\test2.sql" -Force
foreach ($line in (get-content "C:\temp\test.sql"))
{
if ($line.Contains("@@Placeholder@@"))
{
#Find the the user between the brackets and remove the brackets.
$user = ([regex]"\[.+?\]").Match($line).value.replace("[","").replace("]","")
#Replace PlaceHolder with user pulled from the brackets and write to new file
$line -replace '@@Placeholder@@', $user | out-file "C:\temp\test2.sql" -Append
}
else
{
out-file "C:\temp\test2.sql" -Append -InputObject $line
}
}
... Пришлосьнастроить Regex (чтобы он был менее разрешительным) и вывести все остальные строки скрипта тоже.