В нашем отделе программного обеспечения есть программа, которая запускает сценарии SQL из определенной папки.
Теперь мне нужно скопировать эту функциональность в PowerShell.
C #:
var commands = Regex.Split(sqlFileText, @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptio
Я пробовал следующее в PowerShell:
$regex = [regex]'(?im)^\s*GO\s*$'
$commands = $regex.Split($sqlfiletext)
Из того, что я понимаю в Regex, это должно быть разделение SQL-запроса на команды, разделенные словом GO, но в результате $commandsполучается единственная строка, которая кажется абсолютно одинаковой.
Пример текста:
SET ANSI_PADDING OFF
END
GO
USE [DB]
SET NOCOUNT ON
GO
IF NOT EXISTS(SELECT * FROM dbo.Table)
[[[stuff]]]
GO
IF EXISTS
Это явно связано с тем, как я создаю $regex - если я создаю его с помощью следующего, он работает, однако я не получаю вариант без учета регистра:
$regex = new-object System.Text.RegularExpressions.Regex ('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions]::MultiLine)
РЕШЕНИЕ:
Вот два возможных способа вызова конструктора C#:
$regex = new-object regex('^\s*GO\s*$', ([System.Text.RegularExpressions.RegexOptions]::MultiLine -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase))
-bor такой же, как | в C#. Дополнительные скобки необходимы, чтобы не перепутать механизм разрешения перегрузки.
Для лучшей читаемости вы также можете использовать встроенный вызов Enum.Parse:
$regex = new-object regex('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions] "MultiLine, IgnoreCase")
После дальнейшего изучения вопроса, теперь так у меня. Я сделал ошибку в попытке раньше. Вот фрагмент, готовый для копирования / вставки:
([regex]'(?im)^\s*GO\s*$').Split(@"
SET ANSI_PADDING OFF
END
GO
USE [DB]
SET NOCOUNT ON
GO
IF NOT EXISTS(SELECT * FROM dbo.Table)
[[[stuff]]]
GO
IF EXISTS
"@)
Дополнительно:
Кажется, что создание объекта Regex не поддерживает несколько флагов или что-то в этом роде, потому что я никогда не работал так.
Мне удалось разделить его на следующее:
$regex = '(?-im)^\s*GO\s*$'
$commands = $file -split $regex