2016-02-16 9 views
8

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

Это мой сценарий, который я пишу, чтобы переименовывать активных пользователей каталогов на целевое OU из любого формата, в котором они сейчас находятся, в формате 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 
    } 
} 

}

+2

В случае возникновения ошибки было бы полезно вместо того, чтобы нас угадывать. Беглый взгляд говорит, что это неправильно. Set-ADUser $ user -userPrincipalName = $ newname'. Удалите знак равенства – Matt

ответ

6

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

Это позволяет вызывать командлет без specif ying имя параметра. Таким образом, для следующего командлета атрибут 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 "*" 

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

Set-ADUser $user -userPrincipalName = $newname 

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

+0

Благодарим вас за объяснение. Алексис имеет больше смысла. –

2

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

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

Это Командлет подпись, которая корректировала проведя 20-30 минут рыть вниз стек функции ...

Write-Information ("this is a good idea $here") < = ХОРОШО

+1

Это было очень полезно. Я продолжал получать эту ошибку, но не знал, откуда ее выбрасывают. Спасибо! – dstepan

0

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

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

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

Смежные вопросы