求助:PowerShell实现按1万行拆分多SQL文件并添加指定文本
解决方案:PowerShell批量拆分SQL文件并添加事务头
需求明确
- 批量处理输入文件夹下所有SQL文件(含子文件夹)
- 按每10000行拆分单个SQL文件为多个独立小文件
- 每个拆分后的文件开头自动添加
BEGIN TRAN,结尾添加COMMIT TRAN和--ROLLBACK注释 - 拆分结果保存到指定输出文件夹,不修改原文件
现有代码的核心问题
- 逻辑矛盾:开头遍历文件但后续仅处理单个指定文件,未实现批量操作
- 拆分方式错误:在原文件中插入事务语句,而非生成独立的拆分文件
- 硬编码行数(5000行),无法灵活调整
- 重复读取写入文件,效率低下
- 无输出文件夹管理,存在覆盖原文件风险
优化后的PowerShell代码
# 可配置参数 $inputFolder = "C:\TEST" # 输入SQL文件所在文件夹 $outputFolder = "C:\TEST\SplitOutput" # 拆分文件输出文件夹 $linesPerFile = 10000 # 每个拆分文件的业务行数(不含事务语句) # 自动创建输出文件夹(不存在则生成) if (-not (Test-Path -Path $outputFolder)) { New-Item -ItemType Directory -Path $outputFolder | Out-Null } # 遍历所有SQL文件并处理 Get-ChildItem -Path $inputFolder -Filter "*.sql" -Recurse | ForEach-Object { $originalFile = $_ $baseName = $originalFile.BaseName $extension = $originalFile.Extension $content = Get-Content -Path $originalFile.FullName $totalLines = $content.Count $fileCounter = 1 # 按设定行数拆分文件 for ($startLine = 0; $startLine -lt $totalLines; $startLine += $linesPerFile) { # 截取当前批次的业务行 $endLine = [Math]::Min($startLine + $linesPerFile - 1, $totalLines - 1) $currentBatch = $content[$startLine..$endLine] # 构造拆分文件的完整内容 $finalContent = @( "BEGIN TRAN" $currentBatch "" "COMMIT TRAN" "--ROLLBACK" ) # 生成带序号的输出文件名(如:test_001.sql) $outputFileName = "{0}_{1:D3}{2}" -f $baseName, $fileCounter, $extension $outputPath = Join-Path -Path $outputFolder -ChildPath $outputFileName # 写入文件(UTF-8编码避免乱码) $finalContent | Set-Content -Path $outputPath -Encoding utf8 $fileCounter++ } Write-Host "完成拆分:$($originalFile.FullName) → 生成$($fileCounter-1)个文件" } Write-Host "所有SQL文件拆分完毕!"
代码关键说明
- 参数化配置:核心参数集中在顶部,可快速调整路径、拆分行数
- 安全处理:拆分结果全部输出到指定文件夹,原文件完全保留
- 高效IO:单次读取原文件内容,批量截取写入,减少磁盘操作
- 规范命名:拆分文件以原文件名+三位序号命名,便于排序和识别
- 编码兼容:使用UTF-8编码写入,避免不同环境下的乱码问题
使用注意事项
- 先做测试:用少量文件验证拆分结果符合预期后再批量处理
- 权限检查:确保PowerShell对输入文件夹有读取权限、对输出文件夹有写入权限
- 行数调整:根据实际需求修改
$linesPerFile的值即可更改拆分粒度
内容的提问来源于stack exchange,提问作者Paul Ang
相关产品推荐
相关产品推荐

