1

В нашем отделе программного обеспечения есть программа, которая запускает сценарии SQL из определенной папки. Теперь мне нужно скопировать эту функциональность в PowerShell.

C #:

var commands = Regex.Split(sqlFileText, @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline);

Я пробовал следующее в 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)

2 ответа2

3

Вот два возможных способа создания порта 1:1 вызова конструктора 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")

Я не мог заставить работать встроенные опции, похоже, они не поддерживаются / не работают в конструкторе .NET Regex . Они работают при использовании статических методов, таких как Regex.Split:

[regex]::Split($text, "(?im)^\s*GO\s*$")

После дальнейшего изучения оригинальная команда работает для меня. Я сделал ошибку при попытке раньше. Вот фрагмент кода, готовый для копирования / вставки:

([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
"@)
1

Кажется, что создание объекта Regex не поддерживает несколько флагов или что-то еще, потому что я никогда не работал так.

Мне удалось разделить его на следующее:

$regex = '(?-im)^\s*GO\s*$'
$commands = $file -split $regex

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .