簡體   English   中英

powershell - 讀取文件夾中的所有.sql 文件並將它們全部保存到單個.sql 文件中,無需更改換行符或換行符

[英]powershell - read all .sql files in a folder and save them all into a single .sql file without changing line ends or line feeds

我管理數據庫服務器,並且經常必須將腳本應用到不同的服務器或數據庫中。

有時這些腳本都保存在一個目錄中,需要在目標服務器\數據庫中打開運行。

當我一直在研究自動化此任務時,我遇到了如何在目錄中運行所有 PowerShell 腳本以及如何從 SSMS 中執行一組.SQL 文件? 這正是我所需要的,但是我偶然發現了一些問題:

  1. 我不知道文件名

    :setvar path "c:\Path_to_scripts\"

    :r $(path)\file1.sql

    :r $(path)\file2.sql

  2. 我嘗試將 all.sql 文件添加到一件大事中,但是當我從 powershell 復制到 sql 中時,在許多行長的程序中,行變得混亂

    cls

    $Radhe = Get-Content 'D:\apply all scripts to SQLPRODUCTION\*.sql' -Raw

    $Radhe.Count

    $Radhe.LongLength

    $Radhe

  3. 如果我可以讀取該特定文件夾中的所有文件並將它們全部保存到單個the_scripts_to_run.sql文件中,而不更改行尾,那將是完美的。

我不需要特別使用get-content或任何命令,我只想將我的所有腳本放入一個包含所有內容的大型單個腳本中,無需更改。

我怎樣才能做到這一點?

我什至發現將多個 SQL 文件合並到一個 SQL 文件中,但我想通過 powershell 完成它。

這應該可以正常工作,我不確定您不需要使用Get-Content是什么意思,您可以使用[System.IO.File]::ReadAllLines( )[System.IO.File]::ReadAllText( )但是這也應該可以正常工作。 試試看,讓我知道它是否有效。

$path = "c:\Path_to_scripts"
$scripts = (Get-ChildItem "$path\*.sql" -Recurse -File).FullName
$merged = [system.collections.generic.list[string[]]]::new()

foreach($script in $scripts)
{
    $merged.Add((Get-Content $script))
}

$merged | Out-File "$path\mergedscripts.sql"

看起來我和@Santiago有同樣的想法:

Get-ChildItem -Path "$path" -Filter "*.sql" | ForEach-Object -Process {
    Get-Content $_.FullName | Out-File $Path\stuff.txt -Append utf8
        }

這實際上比建議的解決方案簡單得多。 Get-Content采用路徑列表並支持通配符,因此不需要循環。

$path = 'c:\temp\sql'

Set-Content -Path "$path\the_scripts_to_run.sql" -Value (Get-Content -Path "$path\*.sql" -Raw)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM