Convertendo C # Regex para PowerShell

1

Nosso departamento de software tem um programa que executa scripts SQL a partir de uma determinada pasta. Agora preciso replicar essa funcionalidade no PowerShell.

C #:

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

Eu tentei o seguinte no PowerShell:

$regex = [regex]'(?im)^\s*GO\s*$'
$commands = $regex.Split($sqlfiletext)

Pelo que entendi do Regex, isso deve estar dividindo a consulta SQL em comandos separados pela palavra GO, mas a saída de $commands é uma única string que parece ser exatamente a mesma.

Exemplo de texto:

SET ANSI_PADDING OFF
END
GO


USE [DB]
SET NOCOUNT ON
GO

IF NOT EXISTS(SELECT * FROM dbo.Table)
    [[[stuff]]]
GO

IF EXISTS

EDIT: Ok, isso é claramente algo a ver com a maneira como estou criando $regex - se eu criar com o seguinte, funciona, no entanto eu não entendo a opção insensível ao caso:

$regex = new-object System.Text.RegularExpressions.Regex ('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions]::MultiLine)
    
por Deadly-Bagel 30.06.2016 / 17:36

2 respostas

3

Aqui estão duas maneiras possíveis de criar a porta 1: 1 da chamada do construtor C #:

$regex = new-object regex('^\s*GO\s*$', ([System.Text.RegularExpressions.RegexOptions]::MultiLine -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase))

-bor é o mesmo que o | em C #. Os parênteses extras são necessários para não confundir o mecanismo de resolução de sobrecarga.

Para uma melhor legibilidade, você também pode aproveitar a chamada interna para Enum.Parse :

$regex = new-object regex('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions] "MultiLine, IgnoreCase")

Também não pude ter opções in-line para trabalhar, parece que elas não são compatíveis / quebradas no construtor .NET Regex . Eles funcionam ao usar métodos estáticos como Regex.Split :

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

Após um exame mais aprofundado, o comando original funciona para mim. Eu cometi um erro ao tentar mais cedo. Aqui está um snippet pronto para copiar / colar:

([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
"@)
    
por 30.06.2016 / 18:43
1

Parece que criar um objeto Regex não suporta vários sinalizadores ou algo assim, porque nunca funcionei dessa maneira.

Eu consegui dividi-lo com o seguinte:

$regex = '(?-im)^\s*GO\s*$'
$commands = $file -split $regex
    
por 30.06.2016 / 18:24