web-dev-qa-db-ja.com

Powershell-Add-LocalGroupMember-メンバーが存在する場合はサイレントにします

Add-LocalGroupMember を使用して、ローカルグループにユーザーを追加できます。

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

しかし、それはべき等ではありません。ユーザーがすでに存在する場合は、このエラーが発生します

Add-LocalGroupMember:foobarはすでにグループAdministratorsのメンバーです

このコマンドを繰り返し実行する場合に、このコマンドをエラーにしないための最良の方法は何ですか?

その理由は、これがOctopusのデプロイの一部であり、シンプルなものにプリベークされたステップを使用したくないからです。

1
fiat

ラッパーを単純化して、try/catchブロックにすることができます。この例は、メンバーがすでに存在する場合にのみキャッチするため、他のエラーを評価して処理することができます。

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

私はそれをラップするためにこの関数を思いついた

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

しかし、私を逃れるよりエレガントな方法があるかもしれないと感じています

1
fiat

thinkあなたは 'erroractionpreference'を探しているかもしれませんが、この記事ではそれがどのように機能するかのいくつかの例を通して説明します。

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

他の答えを考えると、スクリプトがこの関数よりも大きく、トラブルシューティングを続行する必要がある場合は、コードの最初に設定し、処理が完了したら「続行」に戻すことで、このコードをラップする必要があります。 。これにより、そのような非終了エラーが抑制され、ホストに出力されなくなります。

1
Kyp