2016-04-22 170 views
2

我试图将发现here的脚本改为与PowerShell CSOM等效。在属性中使用散列表键

function setFieldVisibility(listTitle,fieldName,properties,success,failure) 
{ 
    var ctx = SP.ClientContext.get_current(); 
    var web = ctx.get_web(); 
    var list = web.get_lists().getByTitle(listTitle); 
    var field = list.get_fields().getByTitle(fieldName); 
    field.setShowInDisplayForm(properties.ShowInDisplayForm); 
    field.setShowInNewForm(properties.ShowInNewForm); 
    field.setShowInEditForm(properties.ShowInEditForm); 
    field.set_hidden(properties.Hidden); 
    field.update(); 
    ctx.executeQueryAsync(success,failure); 
} 

在推广它的过程中,我试图在哈希表中通过。我想迭代这个散列表来动态地构建要编辑的属性,但是我遇到了一些麻烦。我的功能和用法如下:

Function Set-FieldProperties{ 

    param(
     [Parameter(Mandatory=$true)][string]$Url, 
     [Parameter(Mandatory=$true)][string]$ListTitle, 
     [Parameter(Mandatory=$true)][string]$FieldName, 
     [Parameter(Mandatory=$true)][hashtable]$Properties 
    ) 
    begin { 
     $context = New-Object Microsoft.SharePoint.Client.ClientContext($Url) 
     $context.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($credential.UserName, $credential.Password) 
    } 
    process{ 

     $web = $context.Web 
     $list = $web.Lists.GetByTitle($ListTitle) 
     $field = $list.Fields.GetByTitle($FieldName) 
     foreach($key in $Properties.Keys){ 
      $key 
      $Properties[$key] 
      #failing to make this part dynamic 
      $field.$key($Properties[$key]) 

     } 
     <#$field.ShowInDisplayForm($properties.ShowInDisplayForm) 
     $field.ShowInNewForm($properties.ShowInNewForm) 
     $field.ShowInEditForm($properties.ShowInEditForm) 
     $field.Hidden($properties.Hidden) 
     try{ 
      $field.update() 
      $context.executeQuery() 
      Write-Host -ForegroundColor Green "Field properties updated successfully" 
     } 
     catch{ 
      Write-Host -ForegroundColor Red $_.Exception.Message 
     } 
     #> 
    } 
    end{ 
    $context.Dispose() 
    } 

} 
Set-FieldPoperties -Url "https://tenant.sharepoint.com/teams/eric" -ListTitle "CalcColumns" -FieldName "Title" -Properties @{"SetShowInDisplayForm"=$true; "SetShowInEditForm"=$false} 

我的奋斗是如何让这部分建立所需的输出:

foreach($key in $Properties.Keys){ 
       $key 
       $Properties[$key] 
       #failing to make this part dynamic 
       $field.$key($Properties[$key]) 

      } 

如何使用密钥作为一个属性上设置在这种情况下$ field对象?那可能吗?我不希望有一些巨大的if块检查所有可能的属性,我希望它根据用户在$ Properties散列表中传递的内容来构建这些属性。

回答

1

您可以使用Invoke-Expression来创建一个动态命令,但我们需要转义一些变量,以便它们在执行前不会展开。

@ avvi的解决方案的问题是$Properties[$key]将返回$true,但由于它是字符串中的子表达式,因此它将转换为True。当它被执行时,它将是一个不带引号的字符串,它使得它可以调用函数/ cmdlet /程序名称。这会引发错误,因为名为True的方法不存在等。

"`$field.$key($($Properties[$key]))" 
#Returns: 
$field.test(True) 

#ERROR!! 
At line:17 char:13 
+ $field.test(True) 
+    ~ 


"`$field.$key(`$Properties[`$key])" 
#Returns: 
$field.test($Properties[$key]) 

#Good. Will get value from Properties on execution => Object will not be converted to string. 
#This allow both $key and returned value from $Properties to be any type of object 

尝试:

## START Sample data 
$field = New-Object psobject 
Add-Member -InputObject $field -MemberType ScriptMethod -Name "test" -Value { param($in) $in.Gettype() | Out-Host; "in = $in" } 

$Properties = @{ "test" = $true } 
## END Sample data 


foreach($key in $Properties.Keys){ 
    $key 
    $Properties[$key] 
    #failing to make this part dynamic 
    Invoke-Expression "`$field.$key(`$Properties[`$key])" 
} 

输出:

#From $key and $Properties[$key] 
test 
True 

#From invoke-expression result 
IsPublic IsSerial Name BaseType   
-------- -------- ---- --------   
True  True  Boolean System.ValueType                     

in = True 
+0

就是这样,谢谢。 –

1

你可以使用

Invoke-Expression 

这将动态评估的字符串。

因此,这将是这样的:

iex "`$field.$key($($Properties[$key]))" 
  • 双引号允许封闭变量的评价
  • 反引号逃脱$场参数,这样它的输出字面上
  • $键评估作为$ key的值
  • $()将使所包含的表达式评估
+0

这是非常接近,除了布尔没有过来为$ true或$ false,因为我想我需要的函数来执行。我需要什么或如何适应这种情况? –