使用Powershell中的目录加载文件

时间:2017-09-08 12:02:23

标签: powershell

我正在使用以下代码从文件夹加载SQL脚本并执行它们。

foreach ($sqlScript in Get-ChildItem -path "$pathToScripts" -Filter *.sql | sort-object) {  
            Write-Host "Running Script " $sqlScript.Name

            #Execute the query
            switch ($removeComments) {
                $true {
                    (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -replace '(?s)/\*.*?\*/', " " -split '\r?\ngo\r?\n' -notmatch '^\s*$' |
                        ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                }
                $false {
                    (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -split '\r?\ngo\r?\n' |
                        ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                }
            }
        }

我被问到是否可以使用某种目录以特定顺序执行这些文件,而无需重命名它们。是否可以使用逗号分隔的文件,我可以循环并以相同的顺序加载每个文件?

修改

这是我认为我将要使用的代码:

 Get-Content $executionOrder
            ForEach ($file in $executionOrder) {
                $sqlScript = $pathToScripts + "\" + $file
                Write-Host "Running Script " $sqlScript.Name

                #Execute the query
                switch ($removeComments) {
                    $true {
                        (Get-Content $sqlScript -Encoding UTF8 | Out-String) -replace '(?s)/\*.*?\*/', " " -split '\r?\ngo\r?\n' -notmatch '^\s*$' |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                    }
                    $false {
                        (Get-Content $sqlScript -Encoding UTF8 | Out-String) -split '\r?\ngo\r?\n' |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                    }
                }
            }

1 个答案:

答案 0 :(得分:0)

  

是否可以使用以逗号分隔的文件循环并以相同的顺序加载每个文件

是。您只需更新外观逻辑以考虑该输入。只需进行少量更改即可获得所需内容。

foreach ($sqlScript in (Import-CSV $pathtoCSV)){
    # Process file.
}

如果您想要按照要求输入CSV文件,那将会有效。在注释中,您似乎在预定义目录中获取静态文件名列表。

$pathToFileList = "C:\Bagel.txt"
$rootScriptDirectory = "\\path\to\scripts"
$removeComments = $true

Get-Content $pathToFileList | ForEach-Object{
    # Build the full file paths
    $scriptFilePath = [io.path]::Combine($rootScriptDirectory,$_)

    # If this file actually exists then it should be processed
    If(Test-Path $scriptFilePath -PathType Leaf){
        # Get the file contents
        $fileContents = Get-Content $scriptFilePath -Encoding UTF8 | Out-String

        # Clean the file contents as required
        if($removeComments){
            $queries = $fileContents -replace '(?s)/\*.*?\*/', " " -split '\r?\ngo\r?\n' -notmatch '^\s*$'
        } else {
            $queries = $fileContents -split '\r?\ngo\r?\n'
        }

        # Execute each query of the file 
        $queries | ForEach-Object{
            $SqlCmd.CommandText = $_.Trim()
            $reader = $SqlCmd.ExecuteNonQuery()
        }

        # Hilarity ensues

    } else {
        Write-Warning "Could not locate the file '$scriptFilePath'"
    }
}

switch的功能在这里有点浪费,因为你只有两种状态。将实际获得更改的内容移动到if块中。获取文件列表并测试该文件是否存在。打开它并使用已设置的逻辑解析它的查询。