使用Set-String(Powershell)从另一个文件中删除给定字符串的文本文件中的行

时间:2018-12-26 00:28:43

标签: windows powershell security scripting

基本上发生了什么,我有两个文件,一个包含允许用户列表,另一个实际上在桌面上用户列表。我想做的是使用for循环来抓取AllowedUsers.txt文件中的每个名称,并使用Select-String查找匹配的任何名称并将其从原始Users.txt中删除(列表实际在桌面上的用户数)。最终目标是在Users.txt文件的左侧留下一个不允许在桌面上访问的用户列表,然后我可以在其中再次进行循环浏览,并只需通过命令行删除这些用户即可。

不幸的是,由于我无法完全掌握Select-String或for循环的工作原理,因此无法使它正常工作,但是编写脚本的任何帮助将不胜感激。

AllowedUsers.txt 的示例(输入):

abbby
Sebastian
Evan

Users.txt 的示例(输入):

abbby
Evan
Sebastian
Ethan
zachary

已编辑Users.txt 的示例(所需输出):

Ethan
zachary

1 个答案:

答案 0 :(得分:0)

这是另一种方法。与LotPings的解决方案不同,它使用数组成员资格运算符-notin来查看常规用户列表中的项目是否在允许列表中。我没有覆盖源用户列表,因为这困扰了我。 [咧嘴],您可以轻松地更改它。

请注意,低于3的PoSh版本将需要使用-notcontains并交换项目以将集合置于测试的左侧而不是右侧。感谢Theo的提醒!

# fake reading in a text file
#    in real life, use Get-Content
$AllowedUsers = @'
abbby
Sebastian
Evan
'@ -split [environment]::NewLine

# another fake file read
$AllUsers = @'
abbby
Evan
Sebastian
Ethan
zachary
'@ -split [environment]::NewLine

# this presumes the source files are both text and have the same name format
#    the "-notin" operator is NOT case sensitive
$ExcludedUsers = $AllUsers |
    Where-Object {$_ -notin $AllowedUsers}

# send to screen
$ExcludedUsers

# send to text file
$ExcludedUsers |
    Set-Content -LiteralPath "$env:TEMP\BassoftheC_ExcludedUserList.txt"

在屏幕上...

Ethan
zachary

文本文件内容...

Ethan
zachary