PowerShell: iterar a través de todas las redes, luego iterar a través de todas las listas, luego agregar una columna donde una lista es un nombre determinado
-
10-12-2019 - |
Pregunta
Estoy tratando de armar un script que debe iterar a través de todas las redes en una colección de sitios, luego iterar a través de todas las listas en esas redes, a continuación, agregue una columna donde una lista tiene un nombre determinado.
Esto es lo que tengo hasta ahora:
[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 es el error que recibo:
No puede llamar a un método en una expresión valorada por NULL.A C: \ scripts \ addcalc.ps1: 24 char: 22 + $ Splist.fields.add <<<< ("Calc", "Calculado", 0) + CategoríaInfo: InvalidOperación: (Agregar: Cadena) [], RunTimeException + CompletamenteQualifiedErrorid: invokEthodonnull
Estoy seguro de que es porque no estoy iterando a través de las redes y luego a través de la propiedad en listas.¿Cuál es la forma correcta de lograr lo que estoy tratando de hacer?
Solución
primero: debe eliminar foreach ($list in $spsite.AllWebs)
y luego encontrar la lista usando
$list = $web.Lists["InternalNameOfTheList"]
o
$list = $web.GetList($web.Url + "/Lists/" + $ListName)
y después de eso agregue la columna usando
$spFieldType = [Microsoft.SharePoint.SPFieldType]::Text //change to your field type
$list.Fields.Add("YourColumn",$spFieldType,$false)
$list.Update()
y disponer objeto SPWEB después de usarlo, como lo hace para el objeto SPSITE.
Otros consejos
gracias a Andrey.Tu sugerencia me llevó por el camino correcto.Aquí está la versión final de trabajo del script que resuelve la pregunta 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()