首页 > 解决方案 > 是否有与 -append 相反的方式从文件中删除项目?

问题描述

我正在从一个文件中读取用户列表,更改他们的密码,然后写出 2 个文件,一个成功,一个失败。

我想自动化这个过程。我考虑在脚本完成后进行比较,但是当更改成功时,简单地从列表中删除用户会更干净。对于 out-file 函数,是否有与 -Append 相反的东西?我想编辑文件而不是每次都重写整个文件。

标签: powershell

解决方案


正如评论中提到的,从文件中“删除一行”并不像大多数图形文本编辑器看起来那么简单!

磁盘上文本文件的逻辑内容只是一串连续的字节值。文本处理器可以通过跟踪最低偏移量修改(即最接近编辑器左上角的修改)来优化磁盘 I/O,然后只将文本的剩余部分从对应的偏移量写入磁盘。文件 - 但您不能只是在文件中间“删除一行”作为文件系统操作 - 这只会在文件数据中留下巨大的空白。

假设问题的最大用户数以数百或数千计,您不必担心磁盘性能,只需在 PowerShell 中删除内存中的相关行并用剩余列表覆盖原始文件:

$allUsers = Get-Content .\full_list.txt
$alreadyProcessed = Get-Content .\success.txt

$remainingUsers = $allUsers | Where-Object { $alreadyProcessed -notcontains $_ }

$remainingUsers |Set-Content .\full_list.txt

推荐阅读