使用PowerShell Get-Content截取SQL文件后输出更大的原因及解决办法
问题原因与解决方案
核心原因
- 编码转换是体积暴涨的主因:你的原.sql文件大概率采用UTF-8(无BOM)或ANSI单字节编码,而PowerShell 5.1中,
Get-Content读取内容后,通过>、Out-File或Set-Content输出时默认使用**UTF-16LE(Unicode)**编码——这种编码每个字符占用2字节(特殊字符更多),直接让文件体积翻倍甚至更多。即使改为.txt后缀,只要编码问题没解决,体积依然会远大于原文件。 - 换行符转换的次要影响:原文件可能使用Unix风格的LF换行,PowerShell输出时会自动转为Windows风格的CRLF,每个换行多1字节,但这对整体体积影响极小。
解决办法
1. 匹配原文件编码读取与保存
先确定原文件编码:可以通过Get-Content -Path "你的文件.sql" -Encoding Byte -TotalCount 3查看前3字节判断——UTF-8 BOM是EF BB BF,UTF-16LE是FF FE,无标识则为UTF-8无BOM或ANSI。
- 若原文件是UTF-8无BOM,执行命令:
Get-Content -Path "原文件.sql" -Encoding UTF8 | Select-Object -First 10000 | Set-Content -Path "新文件.sql" -Encoding UTF8 - 若为ANSI编码,将
-Encoding UTF8替换为-Encoding Default(对应系统默认ANSI编码)。
2. 用.NET类高效处理大文件
对于25GB级别的大文件,直接调用.NET的System.IO.File类更高效,避免PowerShell管道的额外开销,同时严格控制编码:
$source = "原文件.sql" $target = "新文件.sql" $keepLines = 10000 $encoding = [System.Text.Encoding]::UTF8 # 根据原文件编码调整,如[System.Text.Encoding]::Default对应ANSI $selectedLines = [System.IO.File]::ReadLines($source, $encoding) | Select-Object -First $keepLines [System.IO.File]::WriteAllLines($target, $selectedLines, $encoding)
该方法逐行读取,内存占用低,且完全保留原编码,新文件体积会和原文件同比例缩小(约为原文件的1/3)。
3. 字符串截取法(仅适合小文件,不推荐25GB文件)
若内存足够容纳前1万行内容,可尝试:
$content = Get-Content -Path "原文件.sql" -Encoding UTF8 -Raw $splitLines = $content -split "`n", ($keepLines + 1) $newContent = $splitLines -join "`n" Set-Content -Path "新文件.sql" -Encoding UTF8 -Value $newContent
注意:25GB文件用-Raw会占用大量内存,可能导致PowerShell崩溃,不建议使用。
内容的提问来源于stack exchange,提问作者Yoav24
相关产品推荐
相关产品推荐

