Powershell:找不到接受参数“xxx”的位置参数

58

我试图理解这个错误的实际含义。到目前为止,对于此错误的类似帮助请求的搜索范围从缺少参数,缺少管道,使用单行或多行以及串联问题。但是,没有一个答案似乎给出了明确的原因。所以我认为问题在于代码格式(这使得跟踪变得更加困难)。

这是我编写的脚本,用于将活动目录用户从任何格式重命名为名字.姓氏的格式,并针对目标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
        }
    }
}

3
让我们知道错误发生的位置会很有帮助,而不是让我们猜测。粗略查看发现这是错误的 Set-ADUser $user -userPrincipalName = $newname。请删除等号。 - Matt
8个回答

34

PowerShell中的Cmdlets接受一堆参数。当这些参数被定义时,您可以为每个参数定义一个位置。

这使您可以在调用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指定参数名称并删除=号。

20

在将我的Write-Host命令转换为Write-Information后,我遇到了这个问题,因为我忘记在参数周围加上引号和圆括号。显然,这些命令的签名不相同。

Write-Host 这是一个好主意 $here
Write-Information 这是一个好主意 $here <=错误的用法

花费了20-30分钟深入挖掘函数堆栈后,以下是可以纠正问题的命令签名...

Write-Information ("这是一个好主意 $here") <=正确的用法


4
非常有帮助。我一直收到这个错误,但不知道它是从哪里抛出的。谢谢! - dst3p
哈哈,只需在第二个参数中添加括号即可解决问题,谢谢。 - Alvaro Rodriguez Scelza
我比五年级聪明吗?不,但@SilverNinja - MSFT是! - nardnob

12

当尝试更改目录时,我遇到了一个问题,使用字符_。 解决方法是使用字符串更改目录。

C:\> cd "my_new_dir"

9

在我的情况下,需要注意的是 破折号连字符 的区别,例如:

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"

破折号连字符减号,一定让你犯迷糊!


1
在我的情况下,命名参数(“-StorageAccountName”适用于cmdlet“Get-AzureStorageKey”)中有一个损坏的字符,在我的编辑器(SublimeText)中显示为完全正常,但Windows Powershell无法解析它。
为了找出问题所在,我将错误消息中的有问题的行移动到另一个.ps1文件中运行,然后错误现在显示在我的“-StorageAccountName”参数开头一个糟糕的字符。
删除该字符(在实际编辑器中看起来正常)并重新输入即可解决此问题。

1
我在编写与AWS CLI交互的Powershell脚本时遇到了类似的挑战,使用了AWS Powershell工具。我运行了以下命令:
Get-S3Bucket // List AWS S3 buckets

然后我遇到了这个错误:

Get-S3Bucket:找不到接受参数列表的位置参数

以下是我的解决方法:

Get-S3Bucket 不接受 // List AWS S3 buckets 作为属性。

我把它放在那里作为注释,但AWS CLI不接受它作为注释。相反,AWS CLI将其视为参数。

我必须这样做:

#List AWS S3 buckets
Get-S3Bucket

这就是全部。

我希望这能帮到你


1
我必须使用


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

要解决这个错误


script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + powershell.AddCommand("Get-ADPermission");``` - Salomanuel

0

在我的情况下,我尝试通过以下方式使代码更易读:

"LONGTEXTSTRING " +
"LONGTEXTSTRING" +
"LONGTEXTSTRING"

一旦我把它改成

LONGTEXTSTRING LONGTEXTSTRING LONGTEXTSTRING 

然后它工作了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接