如果存在意外的空格,如何使用PowerShell替换特定的String?

时间:2016-09-08 09:02:20

标签: string powershell replace

我正在通过Powershell Get-Content 阅读SQL脚本(DDL / DML)。这被分配给一个变量。现在我需要将该脚本中的某些内容替换为我的内容。 示例:

脚本:

**CREATE     TABLE  [dbo].[MyTable]** (
    [MyTableID]     INT NOT NULL,
    [MyTableRecalculated] BIT NULL,
    PRIMARY KEY CLUSTERED ([MyTableID] ASC) ON [PRIMARY]
) ON [PRIMARY];

将“CREATE TABLE [dbo]”替换为:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'MyTable')
DROP TABLE [dbo].[MyTable]
--GO

**CREATE TABLE [dbo].[MyTable]** (

遇到问题:

CREATE TABLE [dbo]。[MyTable] 可能有多个空格限制我在powershell中使用-replace进行替换,因为它会寻找精确的字符串匹配。

我的代码:

    $tempDeltaelement = $Deltaelement -replace 'CREATE TABLE \[dbo\]\.\[([^\]]+)\]', $createwrapperBlock 

Where,
      $Deltaelement =  SQL DML/DDL script read and assigned.
$createwrapperBlock = $createwrapperBlock = @'
PRINT N'Creating [dbo].[$1]...'; 

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'$1')
DROP TABLE [dbo].[$1]

CREATE TABLE [dbo].[$1]
'@

1 个答案:

答案 0 :(得分:0)

以下代码应该可以使用

$sql = @"
CREATE     TABLE  [dbo].[MyTable] (
    [MyTableID]     INT NOT NULL,
    [MyTableRecalculated] BIT NULL,
    PRIMARY KEY CLUSTERED ([MyTableID] ASC) ON [PRIMARY]
) ON [PRIMARY];
"@

$sqlDropCreate = @"
IF OBJECT_ID('{0}.{1}') IS NOT NULL
  DROP TABLE {0}.{1};

CREATE TABLE {0}.{1}
"@

$options = [System.Text.RegularExpressions.RegexOptions]::SingleLine
$capture = [RegEx]::Matches($sql, '\s*CREATE\s*TABLE\s*(\[*\w+\]*)\.(\[*\w+\]*)(.*)', $options)

$schema = $capture.Groups[1].Value
$table  = $capture.Groups[2].Value
$rest   = $capture.Groups[3].Value

$newStart = $sqlDropCreate -f $schema, $table
$newSql = "$newStart$rest"
cls;$newSql

正则表达式将CREATE TABLE [dbo].[MyTable]与CREATE,TABLE和schema.tablename(\ s * sections)之间的任意数量的空格进行匹配。正则表达式也适用于括号内或非括号内的对象名称,但不检查括号是否在两侧 - 如果它们在那里则包含它们。