1. ホーム
  2. powershell

[解決済み】Powershell: 引数 "xxx" を受け入れる位置パラメーターが見つからない。

2021-12-31 19:52:50

質問

このエラーが実際に何を意味するのか理解しようとしています。このエラーに関する類似のヘルプリクエストを検索すると、パラメータの欠落、パイプの欠落、1行または複数行の使用、連結の問題などがありますが、どの回答も決定的な理由を示していないようです。ですから私は、問題はコードの形式だと考えています(そのため、追跡が非常に困難になっています)。

これは、アクティブ・ディレクトリのユーザーをターゲットOUごとに、現在の形式から名字の形式にリネームするスクリプトを書いています。

ADにテストOUを作成し、エラーが発生するユーザーと発生しないユーザーを設定しました。しかし、エラーが発生しないはずのユーザーは、引数 "firstname.surname" を受け入れる位置パラメーターが見つからないというエラーが出ています。

スクリプトの何が問題なのかが分かりませんが、どなたかご指摘いただけると幸いです。

Import-Module ActiveDirectory

$users = $null

$users = Get-ADUser -SearchBase "ou=Testing,ou=Users,dc=my,dc=domain" -Filter * -Properties *
foreach ($user in $users) {
    Write-Host "Processing... $($user)"
    $newname = $null

    # Check first/last name is set
    if (!$user.givenName -or !$user.Surname) {
        Write-Host "$($user) does not have first name or last name set. Please correct, skipping user."
        continue
    } else {
        $newname = ("$($user.givenName).$($user.Surname)")

        #Check if new username already exists
        if (dsquery user -samid $newname) {
            Write-Host "$($user) requires altered username with initial."

            if (!$user.Initials) {
                Write-Host "$($user) does not have any initials set. Please correct, skipping user."
                continue
            }

            $newname = ("$($user.givenName)$($user.Initials).$($user.Surname)")

            #Check if altered new username already exists
            if (dsquery user -samid $newname) {
                Write-Host "$($user) requires manual change. Please correct, skipping user."
                continue
            }
        }

        try {
            #Change UPN
            Set-ADUser $user -userPrincipalName = $newname
            #Change DN
            Rename-ADObject -identity $user -Newname $newname
        } catch {
            Write-Host "Error when renaming $($user). Error is: $($_.Exception.Message). User requires manual change. Please correct, skipping user."
            continue
        }
    }
}

解決方法は?

powershellのCmdletは、たくさんの引数を受け取ります。 これらの引数が定義されている場合、それぞれの引数の位置を定義することができます。

これにより、パラメーター名を指定せずにコマンドレットを呼び出すことができます。 つまり、以下のコマンドレットでは、path 属性の位置を 0 で定義することで、起動時に -Path の入力を省略することができ、その結果、以下の2つのコマンドレットが動作します。

Get-Item -Path C:\temp\thing.txt
Get-Item C:\temp\thing.txt

しかし、定義されている位置パラメーターよりも多くの引数を指定すると、エラーが発生します。

Get-Item C:\temp\thing.txt "*"

このコマンドレットは、2番目の位置パラメータをどのように受け取ればよいのか分からないため、エラーが発生します。 パラメータが何を意味しているかを伝えることで、これを修正することができます。

Get-Item C:\temp\thing.txt -Filter "*"

パラメータ名を正しく指定していないのはここだけのようなので、以下の行でエラーが発生していると推測されます。おそらく、=をパラメータとして、$usernameを別のパラメータとして扱っているのでしょう。

Set-ADUser $user -userPrincipalName = $newname

パラメータ名を$userに指定し、=を削除してみてください。