PowerShell - Iterar todas as webs, em seguida, percorrer todas as listas e , em seguida, adicionar uma coluna onde uma lista é um certo nome
-
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?
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()