PowerShell - Iterar todas as webs, em seguida, percorrer todas as listas e , em seguida, adicionar uma coluna onde uma lista é um certo nome

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/96719

  •  10-12-2019
  •  | 
  •  

Pergunta

Eu estou tentando montar um script que deve iterar todas as webs em um conjunto de sites, em seguida, percorrer todas as listas nessas teias, em seguida, adicionar uma coluna onde um lista tem um certo nome.

Isso é o que eu tenho até agora:

[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()

Este é o erro que eu recebo:

Você não pode chamar um método em uma expressão com valor nulo.No C:\scripts\addcalc.ps1:24 char:22 + $splist.De campos.Adicionar <<<< ("Calc", "Calculado", 0) + CategoryInfo :InvalidOperation:(Adicionar:String) [], RuntimeException + FullyQualifiedErrorId :InvokeMethodOnNull

Eu tenho certeza que é porque eu não estou iterar através de webs e, em seguida, através de listas de propriedade.Qual é a maneira correta de alcançar o que eu estou tentando fazer?

Foi útil?

Solução

Primeiro você deve excluir foreach ($list in $spsite.AllWebs) em seguida, encontrar a lista usando

$list = $web.Lists["InternalNameOfTheList"]

ou

$list = $web.GetList($web.Url + "/Lists/" + $ListName) e depois que adicionar coluna usando

$spFieldType = [Microsoft.SharePoint.SPFieldType]::Text //change to your field type

$list.Fields.Add("YourColumn",$spFieldType,$false)
$list.Update()

E eliminar o objeto SPWeb depois de usá-lo, como você faz para objeto SPSite .

Outras dicas

Graças Andrey.A sua sugestão me levou até o caminho certo.Aqui a última versão do script que resolve a questão original.

[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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top