我试图了解这个错误实际意味着什么。到目前为止,对此错误的类似帮助请求的搜索范围包括缺少参数,缺少管道,使用单行或多行以及连接问题,但没有一个答案似乎给出明确的理由。所以我认为问题是代码格式(这使得追踪更加困难)。
这是我编写的脚本,用于将每个目标OU的活动目录用户从现在的任何格式重命名为firstname.surname格式。
我在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接受一堆参数。定义这些参数后,您可以为每个参数定义一个位置。
这允许您在不指定参数名称的情况下调用cmdlet。因此,对于以下cmdlet,路径属性的位置为0,允许您在调用时跳过键入-Path,因此以下两者都可以。
Get-Item -Path C:\temp\thing.txt
Get-Item C:\temp\thing.txt
但是,如果指定的参数多于定义的位置参数,则会出现错误。
Get-Item C:\temp\thing.txt "*"
由于此cmdlet不知道如何接受第二个位置参数,因此会出现错误。您可以通过告诉它参数是什么来解决这个问题。
Get-Item C:\temp\thing.txt -Filter "*"
我假设您在下面的代码行中收到错误,因为它似乎是您没有正确指定参数名称的唯一地方,也许它将=作为参数和$ username作为另一个参数。
Set-ADUser $user -userPrincipalName = $newname
尝试为$ user指定参数名称并删除=
我将Write-Host
cmdlet转换为Write-Information
之后出现了这个问题,我在参数周围缺少引号和parens。 cmdlet签名显然不一样。
Write-Host this is a good idea $here
Write-Information this is a good idea $here
<=坏
这是在花费20-30分钟挖掘功能堆栈后纠正的cmdlet签名...
Write-Information ("this is a good idea $here")
<=好
在我的情况下,其中一个命名参数中有一个损坏的字符(“-StorageAccountName”代表cmdlet“Get-AzureStorageKey”),在我的编辑器(SublimeText)中显示完全正常,但Windows Powershell无法解析它。
为了找到它的底部,我将错误消息中的违规行移动到另一个.ps1文件中,运行它,现在错误显示在我的“-StorageAccountName”参数的开头有一个拙劣的字符。
删除字符(再次在实际编辑器中看起来很正常)并重新键入它可以解决此问题。
在我的情况下,–
和-
之间的区别如下:
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"
我不得不使用
powershell.AddCommand("Get-ADPermission");
powershell.AddParameter("Identity", "complete id path with OU in it");
通过这个错误