繁体   English   中英

如何使用Powershell批量拆分文件

[英]How do I split file on batches using powershell

如何使用Powershell批量拆分文件?

我有多个批处理的sql post部署文件。 以下是我的postDeployment.sql文件的示例。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'StoredProc') AND type in (N'P', N'PC'))
BEGIN
    DROP PROCEDURE [dbo].[StoredProc]
END

** GO **

CREATE PROCEDURE [dbo].[StoredProc]
    @nodeId int = 0 

AS
BEGIN
    SET NOCOUNT ON;
END

**GO**

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'StoredProc') AND type in (N'P', N'PC'))
BEGIN
    DROP PROCEDURE [dbo].[StoredProc]
END

**GO**

CREATE PROCEDURE [dbo].[StoredProc]     
    @nodeId int = 0 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
END

$ _

我需要自行执行每个批次。 突出显示的** GO **上的Shile分割

我的PS命令如下(无法正常工作):

function GetSqlBatchesFromString($file)
{
    $buffer = new-object System.Text.StringBuilder
    switch -regex -file $file {

        "^\s*GO[\s\d]*$" 
            { 
               # $__ returns go
                $buffer.ToString(); 
                $buffer.Length = 0;
            }
        default 
            { 
            $temp = $buffer.AppendLine($_);
            } 
        }

    $buffer.ToString();
}

function ExecuteBatch($batch)
{
Write-Host "Batch part ==== start"
Write-Host $batch
Write-Host "Batch part ==== end"   
}

 GetSqlBatchesFromString "D:\PostDeployment.sql" | % { ExecuteBatch $__}

这个:

$a = ( [system.io.file]::ReadAllText( "c:\file.sql" ) -split '(?:\bGO\b)' ) | 
% { $_ + "`r`nGO" }

创建一个数组批次批次,然后可以尝试:

$a | % { ExecuteBatch $__}

我已经找到了解决方案,但是它并没有涵盖像SQL里面的GO这样的所有情况:

$file = "D:\PostDeployment.sql"

  $SQLCommandText = @(Get-Content -Path $file) # loads content
    foreach($SQLString in  $SQLCommandText) 
    { 

        if($SQLString -ne "go") # if string is not equal to go then add it to existing string
        { 
            #Preparation of SQL packet 
            $SQLPacket += $SQLString + "`n" 
        } 
        else 
        { 
            Write-Host "---------------------------------------------" 
            Write-Host "Executed SQL packet:" 
            Write-Host $SQLPacket 

            $SQLPacket = ""  # clear up sql string
        } 
    } 
function Get-SqlBatchesFromFile {
    param($file)

    $accumulate = @()

    foreach($line in (get-content $file)){
        if($line -match "^\*\*\s?GO") {        
            $accumulate -join "`r`n"
            $accumulate = @()
        } else {
            $accumulate+=$line
        }
    }
}

filter Invoke-ExecuteBatch {
    Write-Host "Batch part ==== start"
    Write-Host $_
    Write-Host "Batch part ==== end"   
}

Get-SqlBatchesFromString  C:\temp\test.sql | Invoke-ExecuteBatch

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM