PowerShell文件分割脚本末尾出现两行空行的问题求助
PowerShell文本分割脚本:消除末尾额外空行
问题原因
你的脚本出现末尾额外两行空行,主要是三个原因:
- 换行符处理混乱:用
-split "n"分割Windows格式文件时,每行末尾会残留\r,后续拼接又加\n`,导致换行符重复。 Set-Content默认加换行:这个cmdlet会自动在写入内容末尾追加一个换行,加上你拼接时多出来的换行,就凑成了两行空行。- 拼接逻辑冗余:每次添加行都直接加
\n,最后用Trim("n")`只能去掉部分换行,没处理干净。
修复后的脚本
# 分割文本函数:每个文件块最多10万字符,完整保留整行 function DivideText($text) { $maxCharacters = 100000 $parts = @() # 用StringBuilder提升拼接性能,同时精准控制内容 $currentPart = [System.Text.StringBuilder]::new() # 兼容Windows(\r\n)和Unix(\n)换行格式 $lines = $text -split '\r?\n' foreach ($line in $lines) { # 计算加入当前行后的总长度(含换行符) $requiredLength = $currentPart.Length + $line.Length + 2 if ($requiredLength -le $maxCharacters) { # 当前部分非空时才加换行,避免开头空行 if ($currentPart.Length -gt 0) { [void]$currentPart.Append("`r`n") } [void]$currentPart.Append($line) } elseif ($currentPart.Length -eq 0) { # 单行长度超限制,直接作为单独块 $parts += $line } else { # 保存当前块,重置为当前行 $parts += $currentPart.ToString() $currentPart = [System.Text.StringBuilder]::new($line) } } # 添加最后一个非空块 if ($currentPart.Length -gt 0) { $parts += $currentPart.ToString() } return $parts } # 获取所有txt文件 $files = Get-ChildItem -Path . -File -Recurse -Filter *.txt foreach ($file in $files) { $content = Get-Content $file.FullName -Raw $parts = DivideText $content $originalNameWithoutExtension = $file.FullName -replace [regex]::Escape($file.Extension), "" $i = 1 foreach ($part in $parts) { $partNumber = "{0:D2}" -f $i $partFileName = "{0}Parte{1}.txt" -f $originalNameWithoutExtension, $partNumber # 用-NoNewline阻止自动添加末尾换行 Set-Content -Path $partFileName -Value $part -NoNewline -Encoding Default $i++ } Remove-Item $file.FullName -ErrorAction SilentlyContinue } Write-Host "文件分割完成。"
核心修改说明
StringBuilder替代字符串拼接:不仅性能更好,还能精确控制每个块的内容长度,避免冗余换行。- 兼容多平台换行:用
-split '\r?\n'自动识别Windows和Unix换行,不会残留多余的\r字符。 - 精准添加换行:只在块内已有内容时才加换行,从根源避免开头或结尾出现不必要的空行。
Set-Content加-NoNewline:彻底阻止PowerShell在文件末尾额外添加换行,只保留原内容的换行格式。- 正则转义扩展名:处理扩展名中的特殊字符(比如带点的扩展名),避免替换出错。
这样修改后,分割后的文件会完全保留原文件的空行,不会出现额外的两行空行。
内容的提问来源于stack exchange,提问作者Kenryoku
相关产品推荐
相关产品推荐

