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

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

  •  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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top