En primer lugar, en realidad no desea que aquí se elimine el llamado: cuando llama a Dispose en una instancia de SPSite, todos los webs devueltos a través de su OpenWeb también se eliminan porque son "propiedad" de ese SPSite.
Uno de los modelos utilizados por los cmdlets de SharePoint 2010 es una especie de "eliminación diferida", lo que significa que las instancias de SPWeb no se eliminan hasta que finaliza la interconexión en la que están involucradas. Esto funciona así:
function Get-SPWeb {
param([uri]$Url)
begin {
# get SPSite that owns the passed Url
$site = new-object microsoft.sharepoint.spsite $url
# return specific SPWeb instance
$site.OpenWeb()
}
end {
# this disposes owning spsite AND the returned web
$site.Dispose()
}
}
Ahora aquí es cómo funciona esto en la práctica (se trata de una sola línea):
ps> get-spweb "http://localhost/sites/test" | foreach-object {
$_.Title = "New Name"; $_.update()
}
La primera parte será obtener una sola SPWeb
instancia y pasarlo al ForEach-Object
parte. Solo cuando el foreach finalice (y termine de cambiar el título de la web) se llamará al bloque final correspondiente en get-spweb
, que dispone el sitio y la web. Lo que es importante es que toda la tubería es un bloque único de código que se ejecuta en una sola llamada.
Esta voluntad no trabajo de forma interactiva como esto:
ps> $w = get-spweb "http://localhost/sites/test" # calls begin AND end
ps> $w.title = "new name"
ps> $w.update() # boom! web is already disposed
Así que en este último ejemplo que tendría que utilizar una aplicación diferente de conseguir-SPWeb (que omite el bloque final, o suprime con un parámetro de cambio) y luego tendría que deshacerse del sitio usted mismo.
Otro detalle importante es que trabajar de forma interactiva en powershell con objetos sharepoint provocará la pérdida de memoria. De forma predeterminada, PowerShell se ejecuta en MTA (apartamento de subprocesos múltiples) y utilizará un conjunto de subprocesos para ejecutar sus comandos. Cada línea ingresada usará un hilo diferente. Cada vez que accede a un objeto COM con un hilo diferente, perderá algo de memoria del montón no administrado, ya que se asigna un nuevo montón para el cambio de contexto (sin que se libere el anterior). Esto se puede aliviar al iniciar powershell.exe con el interruptor -STA. Esto asegurará que todos los comandos y tuberías se ejecuten con el mismo subproceso, evitando la pérdida de memoria. Dicho esto, simplemente cerrar la consola de PowerShell recuperará toda esa memoria nuevamente, pero las secuencias de comandos de ejecución prolongada pueden privar de memoria a los servidores de la memoria si no se tiene cuidado, derribando a SharePoint (a cualquier otra cosa que no le guste perder el trabajo).) Esta es la razón por la que el enfoque de línea única funciona tan bien en el ejemplo anterior: el objeto se asigna y elimina en la misma interconexión y, por extensión, el mismo subproceso. Sin fuga.
Si vienes del mundo .NET, no hay nada como "usar". Pero creo que vi algunas solicitudes de funciones en ms connect. – stej