Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么赢了';该逻辑是否按预期过滤掉数据?_Windows_Powershell_Scripting - Fatal编程技术网

Windows 为什么赢了';该逻辑是否按预期过滤掉数据?

Windows 为什么赢了';该逻辑是否按预期过滤掉数据?,windows,powershell,scripting,Windows,Powershell,Scripting,我正在使用此代码块从Administrators组中删除任何不是“Lcs”或“Admin”的管理员。然而,“Lcs”仍在从管理组中删除。我认为下面的代码会将脚本配置为只在控制台中为“Lcs”帐户写出一些文本,而不更改其当前状态,但每次运行它时,Lcs都会从Administrators组中删除 $UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" foreach ($User in $Us

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

$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”或“Administrator”。如果帐户名与“Lcs”匹配,则会出现以下行为:

"Lcs" -match "Lcs" → True ⇒ Write-Host "LCS Account Excluded." "Lcs" -match "Guest" -Or "Lcs" -match "Administrator" → False ⇒ net localgroup Administrators $User.Name /Delete
问题是你的逻辑没有按你说的做

如果匹配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
    }
}
这是佩瑟拉尔建议的,应该是可行的。它链接了两个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-匹配“Lcs”
,这样可以正确识别相关的用户帐户。

第二个
如果
->
elseif
@PetSerAl,这似乎没有什么区别。谢谢,这在PetSerAl推荐它时一开始似乎不起作用,但到目前为止,它运行良好。感谢进一步的故障分析。:)
$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 }