PowerShell - Itérer sur tous les sites web, puis itérer sur toutes les listes , puis ajouter une colonne où une liste est un certain nom
-
10-12-2019 - |
Question
Je suis en train de mettre ensemble un script qui doit parcourir tous les sites web dans une collection de sites, puis itérer sur toutes les listes de ces toiles, puis ajouter une colonne où la liste a un certain nom.
C'est ce que j'ai à ce jour:
[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'est l'erreur que je reçois:
Vous ne pouvez pas appeler une méthode sur une expression de valeur null.Au C:\scripts\addcalc.ps1:24 char:22 + $splist.Champs.Ajouter <<<< ("Calc", "Calculé", 0) + CategoryInfo :InvalidOperation:(Ajouter:String) [], RuntimeException + FullyQualifiedErrorId :InvokeMethodOnNull
Je suis sûr que c'est parce que je ne suis pas une itération à travers les sites web et ensuite à travers les listes de la propriété.Quelle est la bonne façon d'atteindre ce que je suis en train de faire?
La solution
Première, vous devez supprimer foreach ($list in $spsite.AllWebs)
puis trouver la liste à l'aide de
$list = $web.Lists["InternalNameOfTheList"]
ou
$list = $web.GetList($web.Url + "/Lists/" + $ListName)
et après que ajouter une colonne à l'aide de
$spFieldType = [Microsoft.SharePoint.SPFieldType]::Text //change to your field type
$list.Fields.Add("YourColumn",$spFieldType,$false)
$list.Update()
Et de disposer SPWeb objet après utilisation, comme vous le faites pour objet SPSite .
Autres conseils
Merci Andrey.Votre suggestion m'a conduit sur le bon chemin.Voici la dernière version de travail du script qui résout la question initiale.
[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()