#powershell #sharepoint
#powershell #sharepoint
Вопрос:
Я выполняю следующее, чтобы получить все представления для всех списков во всех дочерних узлах нашей установки Sharepoint.
$views = @()
foreach ($web in Get-PnPSubWebs) {
foreach ($list in Get-PnPList -Web $web.id) {
foreach ($view in Get-PnPView -list $list.id -web $web.id) {
$views = [pscustomobject]@{Id = $view.Id; StyleId = $view.StyleId}
}
}
}
Который работает нормально, я получаю все представления, как и ожидалось. Но мне не удалось установить новый стиль для представлений.
Я попытался использовать $view.ApplyStyle()
, как описано здесь: https://social.msdn.microsoft.com/forums/sharepoint/en-US/58068fb4-33ad-46cf-b866-bd86e1cbcafb/update-sharepoint-list-view-style-via-powershell и вот здесь: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spview.applystyle.aspx . Однако я получаю следующую ошибку: Method invocation failed because [Microsoft.SharePoint.Client.View] does not contain a method named 'ApplyStyle'.
Затем я попробовал Set-PnPView -Web $web.id -List $list.id -Identity $view.Id -Values @{StyleId=17}
выполнить следующие инструкции: https://learn.microsoft.com/en-us/powershell/module/sharepoint-pnp/set-pnpview?view=sharepoint-ps . Это дало мне только это сообщение: WARNING: Setting property 'StyleId' to '17' failed with exception 'Property set method not found.'. Value will be ignored.
И в крайнем случае $view.StyleId = 17
тоже не работает. Тогда я получаю это: 'StyleId' is a ReadOnly property.
как и ожидалось.
Мы хотим, чтобы все наши списки были в затененном стиле (id: 17). У нас есть сотни списков, и, поскольку я надеюсь, что есть лучший способ, чем потратить целый день на то, чтобы вручную изменить их все. Мне еще предстоит найти способ изменить стиль представления списка по умолчанию, но все наши списки, похоже, настроены на представление «по умолчанию», хотя нет способа увидеть, какой стиль по умолчанию, или изменить его.
Все предложения приветствуются.
Обновить: Это полный сценарий, который я в конечном итоге использовал для всех представлений во всех списках во всех подразделах нашего основного сайта:
Connect-PnPOnline –Url http://sharepointsite –CurrentCredentials
foreach ($web in Get-PnPSubWebs) {
foreach ($list in Get-PnPList -Web $web.id) {
foreach ($view in Get-PnPView -list $list.id -web $web.id) {
[xml]$Doc = New-Object System.Xml.XmlDocument
$Doc.LoadXml($view.ListViewXml);
$element = $Doc.SelectSingleNode("//View//ViewStyle");
if ($element -eq $null)
{
$element = $Doc.CreateElement("ViewStyle");
$element.SetAttribute("ID", 17);
$Doc.DocumentElement.AppendChild($element);
}
else
{
$element.SetAttribute("ID", 17);
}
Set-PnPView -Web $web.id -List $list.id -Identity $view.Id -Values @{ListViewXml=$Doc.FirstChild.InnerXml}
}
}
}
А затем, чтобы получить все списки для основного веб-сайта, я запустил это:
Connect-PnPOnline –Url http://sharepointsite –CurrentCredentials
$web = Get-PnPWeb
foreach ($list in Get-PnPList -Web $web.id) {
foreach ($view in Get-PnPView -list $list.id -web $web.id) {
[xml]$Doc = New-Object System.Xml.XmlDocument
$Doc.LoadXml($view.ListViewXml);
$element = $Doc.SelectSingleNode("//View//ViewStyle");
if ($element -eq $null)
{
$element = $Doc.CreateElement("ViewStyle");
$element.SetAttribute("ID", 17);
$Doc.DocumentElement.AppendChild($element);
}
else
{
$element.SetAttribute("ID", 17);
}
Set-PnPView -Web $web.id -List $list.id -Identity $view.Id -Values @{ListViewXml=$Doc.FirstChild.InnerXml}
}
}
Ответ №1:
Вот мой пример тестового сценария для вашей справки (я тестировал в Интернете, я думаю, он должен работать для SharePoint 2019, поскольку это CSOM api).
Add-Type -Path (Resolve-Path "C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions16ISAPIMicrosoft.SharePoint.Client.dll")
Add-Type -Path (Resolve-Path "C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions16ISAPIMicrosoft.SharePoint.Client.Runtime.dll")
$UserName = "Wendy@tenant.onmicrosoft.com"
$siteURL = "https://tenant.sharepoint.com/sites/lee"
$Password = "password"
[SecureString]$SecurePass = ConvertTo-SecureString $Password -AsPlainText -Force
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Username, $SecurePass)
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
$ctx.credentials = $Credentials
try{
$list = $ctx.web.Lists.GetByTitle("MyList2")
$views = $list.views
$ctx.load($views)
$ctx.executeQuery()
foreach ($v in $views)
{
if ($v.Title -eq "All Items")
{
$ctx.Load($v);
$ctx.ExecuteQuery();
[xml]$Doc = New-Object System.Xml.XmlDocument
$Doc.LoadXml($v.ListViewXml);
$element = $Doc.SelectSingleNode("//View//ViewStyle");
if ($element -eq $null)
{
$element = $Doc.CreateElement("ViewStyle");
$element.SetAttribute("ID", 17);
$Doc.DocumentElement.AppendChild($element);
}
else
{
$element.SetAttribute("ID", 17);
}
$v.ListViewXml = $Doc.FirstChild.InnerXml;
$v.Update();
$ctx.ExecuteQuery();
}
}
}
catch{
write-host "$($_.Exception.Message)" -foregroundcolor red
}