PowerShell - итерация через все сети, затем итерации через все списки, затем добавьте столбец, где список является определенным именем
-
10-12-2019 - |
Вопрос
Я пытаюсь собрать скрипт, который должен произойти с помощью всех сетей в коллекции сайта, затем итерации через все списки в этих полосах, затем добавьте столбцу, где список имеет определенное имя.
Это то, что у меня есть так далеко:
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$True,Position=1)]
[string]$sc
)
$spsite = Get-SPsite $sc
foreach ($web in $spsite.AllWebs)
{
foreach ($list in $spsite.AllWebs)
{
$splist = $list.Lists["PSList"]
$splist.Fields.Add("Calc", "Calculated", 0)
$spfield = $splist.Fields.Getfield("Calc")
$spfield.formula = "=TEXT([Start Date],`"mm/dd/yyyy`")`&`" - `"`&TEXT([End Date],`"mm/dd/yyyy`")"
$spfield.outputtype = "Text"
$spfield.update()
}
}
$spsite.dispose()
.
Это ошибка, которую я получаю:
Вы не можете вызвать метод на ненужном выражении.В C: \ Сценарии \ addcalc.ps1: 24 char: 22 + $ splist.fields.add <<<< («Calc», «рассчитанный», 0) + CatechationInfo: InvalidOperation: (Добавить: строка) [], runtimeexception + ПолкВилеперидрорид: invokeMethodonnull
Я уверен, что это потому, что я не итерацию через веб, а затем через свойство списков.Какой правильный способ достичь того, что я пытаюсь сделать?
Решение
Сначала - вы должны удалить foreach ($list in $spsite.AllWebs)
, затем найти список, используя
$list = $web.Lists["InternalNameOfTheList"]
или
$list = $web.GetList($web.Url + "/Lists/" + $ListName)
и после этого добавить колонку, используя
$spFieldType = [Microsoft.SharePoint.SPFieldType]::Text //change to your field type
$list.Fields.Add("YourColumn",$spFieldType,$false)
$list.Update()
.
и утилизируйте объект SPWEB после его использования, как вы делаете для объекта SPSITE.
Другие советы
Спасибо Андрею.Ваше предложение привело меня к правильному пути.Вот окончательная рабочая версия сценария, которая решает оригинальный вопрос.
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$sc
)
$site = Get-SPSite $sc
$webs = Get-SPWeb $sc
$count = 0
foreach ($web in $site.AllWebs)
{
if (($webs.Count -le $Count) -and ($list = $web.Lists["PSList"]))
{
$list.Fields.Add("Calc", "Calculated", 0)
$field = $list.Fields.Getfield("Calc")
$field.formula = "=TEXT([Start Date],`"mm/dd/yyyy`")`&`" - `"`&TEXT([End Date],`"mm/dd/yyyy`")"
$field.outputtype = "Text"
$field.update()
}
$count ++
}
$site.dispose()
$webs.dispose()
.