PowerShell追加合并多个SQL文件时间隔文本未写入如何解决
错误原因
原代码存在3个核心问题:
- 管道逻辑错误:脚本块中第一个
Add-Content执行写入操作后默认不会向管道输出任何对象,因此管道后方的第二个Add-Content无法收到触发执行的输入,间隔文本写入逻辑根本没有运行。 - 转义字符写法错误:PowerShell中换行符
`n的转义必须写在双引号字符串内部才会生效,原代码将`n放在双引号外侧,反引号会被识别为行续接符,无法生成预期的换行格式。 - 存在内容嵌套风险:如果脚本重复执行,已经生成的
combined_files.sql本身也匹配*.sql后缀规则,会被脚本读取后再次写入合并文件,造成内容重复嵌套。
修正方案
如果不需要处理最后一个文件末尾多余的间隔文本,可以直接使用以下代码:
# 提前删除已存在的旧合并文件,避免内容嵌套 if (Test-Path .\combined_files.sql) { Remove-Item .\combined_files.sql } # 筛选sql文件、按创建时间排序后遍历处理 Get-ChildItem -Filter *.sql | Where-Object Name -ne 'combined_files.sql' | Sort-Object CreationTime | ForEach-Object { # 写入当前sql文件的全部内容 Get-Content $_.FullName -ReadCount 0 | Add-Content .\combined_files.sql # 写入换行与间隔文本 Add-Content -Path .\combined_files.sql -Value "`ndummy text before next file" }
如果需要避免最后一个文件末尾出现多余的间隔文本,可以使用如下版本:
if (Test-Path .\combined_files.sql) { Remove-Item .\combined_files.sql } # 先把排序后的文件列表存入变量 $sqlFiles = Get-ChildItem -Filter *.sql | Where-Object Name -ne 'combined_files.sql' | Sort-Object CreationTime # 按下标遍历文件列表 for ($i = 0; $i -lt $sqlFiles.Count; $i++) { Get-Content $sqlFiles[$i].FullName -ReadCount 0 | Add-Content .\combined_files.sql # 非最后一个文件才写入间隔文本 if ($i -ne $sqlFiles.Count - 1) { Add-Content -Path .\combined_files.sql -Value "`ndummy text before next file" } }
内容的提问来源于stack exchange,提问作者shiva887
相关产品推荐
相关产品推荐

