Powershell - Add-LocalGroupMember - 成员存在时保持静默

Powershell - Add-LocalGroupMember - 成员存在时保持静默

我可以用添加本地组成员将用户添加到本地组:

Add-LocalGroupMember -Group  "Administrators" -Member  "foobar"

但它不是幂等的。如果用户已经存在,则会出现此错误

Add-LocalGroupMember :foobar 已经是管理员组的成员

当您想重复运行此命令时,使该命令不出错的最佳方法是什么?

原因是这是 Octopus 部署的一部分,我不想对于如此简单的事情使用预先准备好的步骤。

答案1

您可以将包装器简化为 try/catch 块。此示例仅在成员已存在时捕获,因此您仍然可以评估和处理其他错误。

try {
    Add-LocalGroupMember -Group $group -Member $member -ErrorAction Stop
} catch [Microsoft.PowerShell.Commands.MemberExistsException] {
    Write-Warning "$member already in $group"
}

答案2

我想出了这个函数来包装它

function Add-LocalGroupMemberSilent($groupName, $username)
{
    $existingMember = Get-LocalGroupMember -Name $groupName | Where {$_.Name -eq "$username"}

    if ($existingMember)
    {
        Write-Host "'$username' is already a member of '$groupName'"
    }
    else
    {
        Write-Host "Adding '$username' to '$groupName'"
        Add-LocalGroupMember -Group "$groupName" -Member "$username"
    }
}

但我觉得可能有一种更优雅的方法,但我没找到

答案3

思考您可能正在寻找“erroractionpreference”,本文通过几个示例解释了它的工作原理。

https://blogs.technet.microsoft.com/heyscriptingguy/2010/03/08/hey-scripting-guy-how-can-i-use-erroractionpreference-to-control-cmdlet-handling-of-errors/

另一个答案是,如果您的脚本比这个函数大,并且您需要继续进行故障排除,那么您需要通过在开始时设置它并在完成处理后将其重新设置为“继续”来包装这段代码。这将抑制类似的非终止错误,因此它们不会打印到您的主机。

相关内容