【问题标题】:How to Use String as a Dynamic Argument Name如何使用字符串作为动态参数名称
【发布时间】:2016-08-15 11:21:49
【问题描述】:

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

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 : 找不到接受参数的位置参数 '-描述'。

我也尝试调用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] 传递,所以我不能再将其用作参数名称?如果是这样,是否有其他方法可以实现这一点(通过函数传递参数名称)?

【问题讨论】:

    标签: powershell active-directory parameter-passing


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

      使用splatting:

      function Set-UserProperty {
          param (
              [String]$Property,
              [String]$NewValue
          )
      
          $SetADUserParameters = @{
              $Property = $NewValue
          }
      
          Get-ADUser Testy.McGee -Properties $Property
          Set-ADUser Testy.McGee @SetADUserParameters
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 2015-03-09
        相关资源
        最近更新 更多