从文本文件中删除匹配的集合对象

时间:2018-12-11 03:29:01

标签: string powershell file text-files

我有一个要存储在文本文件中的用户列表。我正在尝试更新文本文件,以便它删除与$ NotExpiring users变量匹配的所有用户,该变量是一个集合。如果无法从文本文件中删除多个用户,我只是想不出如何正确更新文本文件。

下面是完整功能。您可以忽略其中的大部分内容,只需在#Stuck Here下查看即可。

function Get-NotExpiring{

$NotExpiring=New-Object System.Collections.Generic.List[System.Object]

$MatchedUser=New-Object System.Collections.Generic.List[System.Object]

$textfiles = Get-ChildItem $email_dir



#Day of Span

$Days="20"

#Settings

$Date=Get-Date ((Get-Date).adddays($Days))

$Users=Get-ADUser -filter {(Enabled -eq $True) -and (PasswordNeverExpires -eq $False)} -Properties SamAccountName, DisplayName, msDS-UserPasswordExpiryTimeComputed, Mail | Where-Object { $_.DisplayName -ne $nul -and ($_."msDS-UserPasswordExpiryTimeComputed" -gt ($NotExpDate.ToFileTime()))} | Select SamAccountName, Mail, DisplayName,@{Name="ExpiryDate";Expression={([datetime]::fromfiletime($_."msDS-UserPasswordExpiryTimeComputed")).DateTime}}

#Magic

foreach ($Entry in $Users) {



$EntryDate = Get-date($Entry.ExpiryDate)

if ($EntryDate -gt $Date){



$Account = $Entry.SamAccountName

$ExpDate = $Entry.ExpiryDate

$NotExpiring.add($Account)

}

}



#STUCK HERE

foreach($file in $textfiles){

foreach ($user in $NotExpiring){

if((Get-Content "$email_dir\$file") -contains $user){

$temp_get = Get-Content $email_dir\$file | where {$_ -notmatch $user}

}}}



$temp_get}

我在下面尝试过,但是如果现有文本文件中还有多个用户是$ NotExpiring,这似乎也不起作用。任何帮助,将不胜感激。我知道这是一个简单的修复程序,但我似乎无法弄清楚。

Get-Content $email_dir\$file | where {$_ -notmatch $user} | Set-Content <path>.txt

使用以下解决方案,我能够完全实现所需的功能。

foreach($file in $textfiles){ foreach ($user in $NotExpiring){

if((Get-Content "$email_dir\$file") -contains $user){ 
$MatchedUser.add($user) 
}}
Get-Content "$email_dir\$file" | Where {$MatchedUser -NotContains $_ } | Set Content "$temp_dir\$file" 

Copy-Item -path "$temp_dir\$file" -Destination "$email_dir\$file" -ErrorAction SilentlyContinue }

1 个答案:

答案 0 :(得分:0)

基本上,您正在尝试匹配两个数组。 使用whereforeach对象。现在,您必须将单个对象$_与数组$user匹配。
使用:

...| where {$_ -notin $user}

...| where {$user -notcontains $_}