Не найден позиционный параметр, который принимает аргумент "ххх"

Я пытаюсь понять, что на самом деле означает эта ошибка. До сих пор поиск похожих запросов на помощь по этой ошибке варьировался от отсутствующих параметров, отсутствующих каналов, использования одиночных или многострочных линий, а также от проблем конкатенации, но ни один из ответов, по-видимому, не дает определенной причины. Поэтому я предполагаю, что проблема заключается в формате кода (что делает его намного сложнее отследить).

Это мой сценарий, который я пишу, чтобы переименовать активных пользователей каталога для целевого подразделения из любого формата, в котором они сейчас находятся, в формат firstname.surname.

Я создал тестовое подразделение в AD с некоторыми пользователями, которые будут вызывать ошибки, а некоторые - нет. Однако пользователи, которые не должны выдавать мне ошибку, сообщают мне, что "не найден позиционный параметр, который принимает аргумент" 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
        }
    }
}

Ответ 1

Командлеты в powershell принимают кучу аргументов. Когда эти аргументы определены, вы можете определить позицию для каждого из них.

Это позволяет вам вызывать командлет без указания имени параметра. Таким образом, для следующего командлета атрибут path определяет с позицией 0, позволяя вам пропускать ввод -Path при вызове его и как таковой будут работать следующие.

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

Однако, если вы укажете больше аргументов, чем определены позиционные параметры, вы получите сообщение об ошибке.

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

Поскольку этот командлет не знает, как принять второй позиционный параметр, вы получаете ошибку. Вы можете исправить это, сообщив ему, что должен означать этот параметр.

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

Я предполагаю, что вы получаете ошибку в следующей строке кода, поскольку это единственное место, где вы не указали имена параметров правильно, и, возможно, он обрабатывает параметр = как параметр и $username в качестве другого параметра.

Set-ADUser $user -userPrincipalName = $newname

Попробуйте указать имя параметра для $user и удалите =

Ответ 2

У меня возникла эта проблема после преобразования моих командлетов Write-Host в Write-Information, и мне не хватало кавычек и parens вокруг параметров. Подписи командлета, очевидно, не совпадают.

Write-Host this is a good idea $here
Write-Information this is a good idea $here <= BAD

Это сигнатура cmdlet, которая исправлена ​​после того, как потратила 20-30 минут на копирование стека функций...

Write-Information ("this is a good idea $here") <= GOOD

Ответ 3

В моем случае был поврежден символ в одном из названных параметров ( "-StorageAccountName" для cmdlet "Get-AzureStorageKey" ), который в редакторе (SublimeText) выглядел совершенно нормально, но Windows Powershell не смог его разобрать.

Чтобы понять это, я переместил строки нарушения из сообщения об ошибке в другой файл .ps1, выполнив это, и ошибка теперь показала неудачный символ в начале моего параметра "-StorageAccountName".

Удаление символа (снова выглядящего нормальным в фактическом редакторе) и повторная ввод его устраняет эту проблему.

Ответ 4

В моем случае это была разница между и - как в:

Add-Type –Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"

а также:

Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"

Ответ 5

Я должен был использовать

powershell.AddCommand("Get-ADPermission");
powershell.AddParameter("Identity", "complete id path with OU in it");

чтобы пройти эту ошибку

Ответ 6

В моем случае я попытался сделать код более читабельным, поставив:

"LONGTEXTSTRING " +
"LONGTEXTSTRING" +
"LONGTEXTSTRING"

Как только я изменил его на

LONGTEXTSTRING LONGTEXTSTRING LONGTEXTSTRING 

Тогда это сработало