PowerShell批量写入nfo文件第8行文件名编号失效问题
问题根因
批量执行失败的核心问题出在脚本逻辑设计上:
- 你在
ForEach-Object循环里把$filePath写死成了.\*.nfo,每次循环都会匹配当前目录下所有nfo文件,而非当前遍历到的单个文件,会导致所有文件被反复读取、覆盖,最终内容完全错乱。单文件测试时目录下只有1个nfo,通配符.\*.nfo刚好匹配到测试文件,所以功能正常,多文件时该逻辑就会完全失效。 - 没有做文件行数校验,如果某个nfo文件实际行数不足8行,直接给索引位置
7赋值会触发索引越界报错,中断批量执行。 - 读写文件没有指定编码,PowerShell默认编码可能和nfo文件原有编码不匹配,容易出现写入后乱码的问题。
修复后可直接运行的脚本
Get-ChildItem -Filter "*.nfo" -File | ForEach-Object{ # 从当前文件名提取编号,生成要写入的标签内容 $namePart = $_.BaseName -Split ' - ' $writeContent = "<episode>$($namePart[1])</episode>" # 仅读取当前遍历到的单个nfo文件内容,指定UTF8编码避免乱码 $fileContent = Get-Content -Path $_.FullName -Encoding UTF8 $targetLineIndex = 7 # 第8行对应数组从0开始计数的索引位 # 如果文件行数不足8行,自动补空行避免报错 while ($fileContent.Count -lt 8) { $fileContent += "" } # 替换第8行内容后写回原文件 $fileContent[$targetLineIndex] = $writeContent $fileContent | Set-Content -Path $_.FullName -Encoding UTF8 }
注意事项
- 脚本默认处理当前执行目录下的所有nfo文件,运行前请把脚本放到nfo所在目录,或者提前在PowerShell中切换到对应目录再执行。
- 如果你的nfo文件需要使用其他编码(比如GB2312),把脚本里两处
UTF8替换为对应编码名称即可。 - 首次运行建议先复制3-5个测试文件到单独文件夹验证效果,确认写入的编号、位置、编码都符合要求后,再全量处理所有文件。
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

