【问题标题】:Access SharePoint expanded properties访问 SharePoint 扩展属性
【发布时间】:2015-07-23 08:23:08
【问题描述】:

我正在访问的 SharePoint 列表具有关联的利益相关者实体 -- 我很难访问利益相关者的属性。

“主要”内容的属性位于 xpath /feed/entry/content/properties/*。利益相关者的属性位于 xpath /feed/entry/link/inline/entry/content/properties/*。

假设我在 odata 查询中包含利益相关者的姓名:

http://server/list/_vti_bin/listdata.svc/TheList?$select=Id,Title,Stakeholder/Name&$expand=Stakeholder

枚举提要的属性时如何引用利益相关者的属性?

使用此代码,Stakeholder.Name 属性不会被填充:

(Invoke-RestMethod -Uri $url -Method Get -UseDefaultCredentials).entry.content.properties | Foreach {
  [PsCustomObject]@{
    Id=$_.Id."#text"; 
    Title=$_.Title; 
    StakholderName=$_.Stakeholder.Name;
  }
}

我是否需要为利益相关者填充第二个PsCustomObject,然后合并“主要”数据?

【问题讨论】:

    标签: powershell sharepoint sharepoint-2010 odata powershell-3.0


    【解决方案1】:

    查询格式错误,因为$ 符号必须使用单引号字符串文字进行转义,例如:

    $url = "http://contoso.intranet.com/_vti_bin/listdata.svc/TheList?`$select=Id,Title,Stakeholder/Name&`$expand=Stakeholder"
    

    然后Stakeholder 值可以检索到,如下所示:

    $StakeholderValue = $data.link | where { $_.title -eq "Stakeholder" } | select -Property @{name="Name";expression={$($_.inline.entry.content.properties.Name)}}
    

    修改示例

    $url = "http://contoso.intranet.com/_vti_bin/listdata.svc/TheList?`$select=Id,Title,Stakeholder/Name&`$expand=Stakeholder"
    
    $data = Invoke-RestMethod -Uri $url -Method Get -UseDefaultCredentials -ContentType "application/json;odata=verbose"  
    
    $data  | Foreach {
        [PsCustomObject]@{
           Id = $_.content.properties.Id."#text"; 
           Title = $_.content.properties.Title; 
           Stakeholder = $_.link | where { $_.title -eq "Stakeholder" } | select -Property @{name="Name";expression={$($_.inline.entry.content.properties.Name)}}
        }
    }
    

    或者,我建议考虑另一种方法。默认情况下,SharePoint 2010 REST 服务以xml 格式返回结果。这个想法是以json 格式返回结果。

    很遗憾,Invoke-RestMethod 和 Invoke-WebRequest 可能不能用于此目的 因为它们都包含 PowerShell 3.0 中的错误,根据 Microsoft Connect.

    这个特殊的错误阻止我们使用 SharePoint REST 服务,因为 由于无法指定 Accept 标头,因此无法指定结果 以json 格式返回

    话虽如此,我还是建议利用WebClient Class。

    下面演示了以JSON 格式返回结果的相同示例。请注意,与原始示例相比,获取 List Item 属性变得更加容易:

    Function Execute-RequestJson()
    {
    Param(
      [Parameter(Mandatory=$True)]
      [string]$Url,
      [Parameter(Mandatory=$False)]
      [System.Net.ICredentials]$Credentials,
      [Parameter(Mandatory=$False)]
      [bool]$UseDefaultCredentials = $True,
      [Parameter(Mandatory=$False)]
      [Microsoft.PowerShell.Commands.WebRequestMethod]$Method = [Microsoft.PowerShell.Commands.WebRequestMethod]::Get 
    )
    
       $client = New-Object System.Net.WebClient
       if($Credentials) {
         $client.Credentials = $Credentials
       }
       elseif($UseDefaultCredentials){
         $client.Credentials = [System.Net.CredentialCache]::DefaultCredentials 
       }
       $client.Headers.Add("Content-Type", "application/json;odata=verbose")
       $client.Headers.Add("Accept", "application/json;odata=verbose")
       $data = $client.DownloadString($Url)
       $client.Dispose()
       return $data | ConvertFrom-Json
    }
    
    
    
    
    
    $url = "http://contoso.intranet.dev/_vti_bin/listdata.svc/TheList?`$select=Id,Title,Stakeholder/Name&`$expand=Stakeholder"
    $data = Execute-RequestJson -Url $url -UseDefaultCredentials $true
    
    $data.d.results | Foreach {
        [PsCustomObject]@{
           Id = $_.Id; 
           Title = $_.Title; 
           Stakeholder = $_.Stakeholder.Name
        }
    }
    

    【讨论】:

    • 有趣的是,OData 查询无需转义$。 OData 的示例似乎表明这不是必需的。
    • Execute-RequestJson 功能非常有用——谢谢!鉴于ConvertFrom-Json 生成PsCustomObject,您的示例中的Foreach 似乎没有必要。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多