首页 > 解决方案 > Powershell 和 Regex 来整理生成的 SQL 脚本

问题描述

我正在使用 SQL 包生成更新脚本。

但是我想修改它以删除注释和命令,例如

:setvar DefaultDataPath ""
:setvar DefaultLogPath ""

我已经尝试了几次使用正则表达式编写 powershell 脚本来执行此操作,但似乎无法使其正常工作。

SQL 脚本提取

/*
Deployment script for Genohsis/p:AllowIncompatiblePlatform=True/p:CommentOutSetVarDeclarations=True

This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/

GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;

SET NUMERIC_ROUNDABORT OFF;


GO
:setvar DatabaseName "Genohsis/p:AllowIncompatiblePlatform=True/p:CommentOutSetVarDeclarations=True"
:setvar DefaultFilePrefix "Genohsis_p_AllowIncompatiblePlatform=True_p_CommentOutSetVarDeclarations=True"
:setvar DefaultDataPath ""
:setvar DefaultLogPath ""

GO
:on error exit

以前的解决方案

我之前使用 TFS 中的 .net 构建任务来完成此操作。这工作得很好,但现在我们已经转移到 DevOps // 删除顶部部分,希望在 powershell 脚本中执行

Regex objRegex = new Regex(@"/\*\r\n:setvar(.*\r\n)*?(?=/\*)");
strFileContents = objRegex.Replace(strFileContents, "");

我的尝试

(Get-Content Upgrade.sql) -replace([Regex]::Escape(':setvar(.*\r\n)*?(?=/\*)'), '') | Set-Content Upgrade_Modified.sql

(Get-Content "Upgrade.sql") | ForEach-Object{$_ -replace [Regex]::Escape('(?m)^:setvar.*'), ''} | Set-Content "Upgrade_Output.sql"

两者都不起作用,但我对 powershell 或正则表达式不是很有经验。

非常感谢任何帮助。

谢谢

标签: sqlregexpowershellreplace

解决方案


您在此处查找的正则表达式字符串是^:setvar.*. Regex.Escape方法用于将正则表达式引擎字符(, \, *, +, ?, |, {, [, (, ), ^, $,.#空格)转义为文字字符串。此字符串不需要它。

(Get-Content "Upgrade.sql") -replace '^:setvar.*' | Set-Content Upgrade.sql

运算符的固有问题/好处-replace是默认替换是空字符串。因此,如果您不替换换行符,您的文件中将留下空白行。不使用正则表达式单行模式,.不会匹配任何换行符。如果要删除整行,除了-replace. 您可以一起考虑使用不同的运算符。

# for multi-line files as single strings return true/false only
(Get-Content "Upgrade.sql") -notmatch '^:setvar.*' | Set-Content Upgrade.sql

# for single or multi-line files
(Get-Content "Upgrade.sql") | Where {$_ -notmatch '^:setvar.*'} | Set-Content Upgrade.sql

# replacing newline characters
# -Raw switch reads in the file as a single string making newline characters replaceable.
# Now multi-line mode (?m) needs to be used to treat ^ as the beginning of each line
(Get-Content "Upgrade.sql" -Raw) -replace '(?m)^:setvar.*\r?\n' | Set-Content Upgrade.sql

Get-Content如果没有-Raw开关,则将文件的每一行作为数组元素读取。因此,无论预输出替换如何,该数组的输出都将在每个元素之间添加换行符。


推荐阅读