2014-01-28 52 views
0

我試圖更新的SharePoint 2013磨漿機的WebPart直通下面的PowerShell腳本:的Sharepoint 2013 SelectedRefinementControlsJson拋出錯誤

$spweb = Get-SPWeb "http://da-server/search/" 
$page = $spweb.GetFile("Pages/results.aspx") 
$page.CheckOut() 
# Find the Refinement web part 
$webPartManager = $spweb.GetLimitedWebPartManager("http://da- server/search/Pages/results.aspx", [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared) 
$rwp = $webpartmanager.webparts | ? { $_.title -eq 'Refinement' } 
# Refiners are updated by changing the JSON 
$j = $rwp.SelectedRefinementControlsJson | ConvertFrom-Json 
$j.refinerConfigurations | % { if ($_.propertyName -eq 'LastModifiedTime') {  $_.displayName = 'Mod Time'; } 
**$rwp.SelectedRefinementControlsJson = ConvertTo-Json $j -Compress** This line throwing the error. 
# Save our changes 
$webpartmanager.SaveChanges($rwp)   # save changes to webpart 
$page.CheckIn('Changed last mod refiner') 
$page.Publish('Changed last mod refiner') 

上述突出線10拋出下面的錯誤:

Exception setting "SelectedRefinementControlsJson": No parameterless constructor defined for type of 'Micrososft.Office.Server.Search.WebControls.RefinementControl[]'" 

回答

0

我猜您在一個或多個煉油廠中只定義了一個別名。在這種情況下,PS ConvertTo-Json函數將數組轉換爲一個字符串。更多細節在這裏https://superuser.com/questions/414650/why-does-powershell-silently-convert-a-string-array-with-one-item-to-a-string

發現當我用同樣的問題掙扎,這裏是我的解決方案

Function ConvertTo-Json { 

param($inputObject) 

    if ($inputObject -eq $null) { "null" } 
    else { 
     switch ($inputObject.GetType().Name) { 
      "String" { '"' + $inputObject +'"' } 
      "Boolean" { 
       if($inputObject){ 
        "true" 
       } 
       else { 
        "false" 
       } 
      } 
      "Object[]" { 
       $items = @() 
       $inputObject | % { 
        $items += ConvertTo-Json $_ 
       } 
       $ofs = ","; "[" + [string]$items + "]" 
      } 
      "PSCustomObject" { 
       $properties = @() 
       $inputObject | Get-Member -MemberType *Property | % { 
        $properties += '"'+ $($_.Name) + '":' + $(ConvertTo-Json $inputObject.($_.Name)) 
       } 
       $ofs = ","; "{" + [string]$properties + "}" 
      } 
      default { $inputObject } 
     } 
    } 
} 

現在,它可以像以前一樣使用,但沒有-compress參數

$rwp.SelectedRefinementControlsJson = ConvertTo-Json $j 
3

嘗試ConvertTo-Json $j -Depth 3

開箱即用,Modified By屬性有多個別名,它是一個嵌套級別。默認ConvertTo-Json只有2級。所以你必須使用-depth來正確轉換它。