为什么这个逻辑不能按照预期过滤数据呢?

我正在使用此代码块来删除pipe理员组中不是“Lcs”或“Admin”的任何pipe理员。 但是,“Lcs”仍然从pipe理组中删除。 我认为下面的代码会将脚本configuration为仅仅在控制台中为“Lcs”帐户写出一些文本而不改变它的当前状态,但是每次运行它时都会从Administrators组中删除Lcs。

$UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" foreach ($User in $UserList) { if($User.Name -match "Lcs") { Write-Host "LCS Account Excluded." } if($User.Name -match "Guest" -Or $User.Name -match "Administrator") { Write-Host "Default Windows Accounts Excluded." } else { net localgroup Administrators $User.Name /Delete } } 

你的循环体包含两个语句(最有可能不是故意的):一个if语句(没有else分支)在那里你检查名称是否匹配“LCS”,另一个(与else分支)你检查名称是否匹配“Guest”或“管理员”。 如果帐户名称与“Lcs”匹配,则会出现以下行为:

  “Lcs”-match“Lcs”→True⇒Write-Host“LCS账户排除”。
 “Lcs”-match“Guest” - 或“Lcs”-match“Administrator”→False⇒net本地组管理员$ User.Name / Delete 

使用具有多个条件的单个if语句来避免这种情况:

 if ($User.Name -match "Lcs") { Write-Host "LCS Account Excluded." } elseif ($User.Name -match "Guest" -Or $User.Name -match "Administrator") { Write-Host "Default Windows Accounts Excluded." } else { net localgroup Administrators $User.Name /Delete } 

问题是你的逻辑不是在做你所告诉的。

IF与LCS写主机相匹配“一只小狗因使用写主机而死亡”

如果匹配访客或管理员写主机“另一只小狗刚刚死亡”否则删除帐户

你的两个陈述分开执行。 如果匹配的话,第一个IF语句直接写入控制台。

 $UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" foreach ($User in $UserList) { if($User.Name -match "Lcs") { Write-Host "LCS Account Excluded." } elseif($User.Name -match "Guest" -Or $User.Name -match "Administrator") { Write-Host "Default Windows Accounts Excluded." } else { net localgroup Administrators $User.Name /Delete } } 

PetSerAl建议并应该这样做。 它链接你的两个IF语句,所以第二个只在第一个不是时才执行。

或者,如果你不关心输出:

 $UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" | Where { $_.Name -notmatch "Lcs" -and ` $_.Name -notmatch "Guest" -and ` $_.Name -notmatch "Administrator" } | Foreach-Object { net localgroup Administrators $_.Name /Delete } 

这将使用WHERE语句在将其传递给FOREACH之前过滤掉您不想处理的内容。 这是更有效率,但你没有得到输出。

注:我只是在这里纠正你的逻辑,并假设$User.Name -match "Lcs"等正确识别相关的用户帐户。