Powershell – 添加本地组成员 – 当成员存在时保持沉默

我可以使用Add-LocalGroupMember将用户添加到本地组中:

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

但它不是幂等的。 如果用户已经存在,那么你会得到这个错误

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

当你想重复运行这个命令时,使这个命令不会出错的最好方法是什么?

原因是这是Octopus部署的一部分,我不想使用预焙步骤来实现这么简单的事情。

你可以简化你的包装到一个try / catch块。 这个例子只捕获成员已经存在的时间,所以你仍然可以评估和处理其他错误。

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

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

 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" } } 

但我觉得可能有一种更优雅的方式逃避我

你可能正在寻找'erroractionpreference',这篇文章通过几个例子来解释它的工作原理。

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

给出另外一个答案,如果你的脚本比这个函数大,并且你需要继续排除故障,那么你需要在开始时设置它,并且在你完成处理后把它设置回“continue” 。 这将抑制像这样的非终止错误,所以他们不打印到您的主机。