Powershell: не удается найти позиционный параметр, который принимает аргумент " xxx"
Я пытаюсь понять, что на самом деле означает эта ошибка. До сих пор поиск подобных запросов справки для этого диапазона ошибок от отсутствующих параметров, отсутствующих труб, использования одиночных или нескольких строк, а также проблем конкатенации, но ни один из ответов, похоже, не дает окончательной причины. Поэтому я предполагаю, что проблема заключается в формате кода (что делает его намного сложнее отследить).
Это мой скрипт, который я пишу, чтобы переименовать пользователей active directory на целевой OU из любого формата сейчас в "имя".формат фамилия.
Я создал тестовый OU в AD с некоторыми пользователями, которые будут вызывать ошибки, а некоторые-нет. Однако пользователи, которые не должны давать мне ошибку, дают мне "позиционный параметр не может быть найден, который принимает аргумент "firstname.фамилия"
Я не вижу, что не так со скриптом, но, надеюсь, кто-то может дать мне несколько указателей.
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
}
}
}
3 ответов
командлеты в powershell принимают кучу аргументов. Когда эти аргументы определены, вы можете определить позицию для каждого из них.
это позволяет вызывать командлет без указания имени параметра. Таким образом, для следующего командлета атрибут path определяется с позицией 0, позволяющей пропустить путь ввода при его вызове, и как таковой будет работать следующее.
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 и удалить =
у меня была эта проблема после преобразования Write-Host
командлетов Write-Information
и мне не хватает кавычки и скобки вокруг параметров. Подписи командлетов, очевидно, не совпадают.
Write-Host this is a good idea $here
Write-Information this is a good idea $here
это подпись командлета, которая исправлена после 20-30 минут копания стека функций...
Write-Information ("this is a good idea $here")
в моем случае был поврежден символ в одном из именованных параметров ("- StorageAccountName "для командлета" Get-AzureStorageKey"), который показался совершенно нормальным в моем редакторе (SublimeText), но Windows Powershell не смог его разобрать.
чтобы добраться до сути, я переместил оскорбительные строки из сообщения об ошибке в другое .ps1 файл, запустил это, и ошибка теперь показала неудачный символ в начале моего параметра "-StorageAccountName".
удаление символ (опять же, который выглядит нормально в фактическом редакторе) и повторный ввод исправляет эту проблему.