如何使用字符串作为动态参数名称

时间:2016-08-15 11:21:50

标签: powershell active-directory parameter-passing

我正在尝试创建一个可以更新给定属性的函数,其中属性的名称传递给函数,如下所示:

function Set-UserProperty {
    param (
        [String]$Property,
        [String]$NewValue
    )

    Get-ADUser Testy.McGee -Properties $Property
    Set-ADUser Testy.McGee -$Property $NewValue
    # Set-ADUser Testy.McGee -Description $NewValue # <<<<< THIS WORKS
}

Set-UserProperty -Property "Description" -NewValue "New Description"

我可以很好地检索用户,但是当我尝试设置新的Description时,我收到此错误:

  

Set-ADUser:找不到接受参数的位置参数   '-Description'。

我也试过调用Set-ADUser Testy.McGee $Property $NewValue,但这只会导致:

  

Set-ADUser:找不到接受参数的位置参数   '说明'。

从第一个错误看,PowerShell似乎正在尝试执行:

Set-ADUser "Testy.Mcgee" -Description "New Description",因为它抱怨'-Description'参数。

但是,当我调用该确切行(Set-ADUser "Testy.Mcgee" -Description "New Description")时,用户将在AD中更新。

我是否正确地认为,因为我将参数作为[string]传递,我不能再将其用作参数名称?如果是这样,是否有其他方法可以实现这一点(通过函数传递参数名称)?

1 个答案:

答案 0 :(得分:1)

试试这个:

function Set-UserProperty {
    param (
        [String]$Property,
        [String]$NewValue
    )

    Get-ADUser Testy.McGee -Properties $Property
    $Command = "Set-ADUser Testy.McGee -$Property $NewValue"
    Invoke-Expression $Command
    # Set-ADUser Testy.McGee -Description $NewValue # <<<<< THIS WORKS
}