PowerShell - itera attraverso tutte le Web, quindi itera attraverso tutti gli elenchi, quindi aggiungi una colonna in cui un elenco è un certo nome

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

  •  10-12-2019
  •  | 
  •  

Domanda

Sto cercando di mettere insieme uno script che dovrebbe iterare attraverso tutte le web in una raccolta del sito, quindi iterano attraverso tutti gli elenchi in tali nastri, quindi aggiungere una colonna in cui un elenco ha un certo nome.

Questo è ciò che ho finora:

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

Questo è l'errore che ottengo:

.

Non è possibile chiamare un metodo su un'espressione null-stimata.A C: \ Script \ AddCalc.ps1: 24 Char: 22 + $ Splist.fields.add <<<< ("calc", "calcolato", 0) + CategoriaInfo: InvalidOperation: (Aggiungi: String) [], runtimeException + CompletoQualifiederrorid: InvokeMethodonnull

Sono sicuro che è perché non sto iterando attraverso le reti e poi attraverso la proprietà degli elenchi.Qual è il modo corretto per ottenere ciò che sto cercando di fare?

È stato utile?

Soluzione

Primo - È necessario eliminare foreach ($list in $spsite.AllWebs), quindi trovare l'elenco usando

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

o

$list = $web.GetList($web.Url + "/Lists/" + $ListName) E dopo quella colonna Aggiungi

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

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

e dispose l'oggetto SPWeb dopo averlo usato, come fai per l'oggetto SPSite.

Altri suggerimenti

Grazie Andrey.Il tuo suggerimento mi ha portato giù la strada giusta.Ecco la versione finale finale dello script che risolve la domanda originale.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top