El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Powershell Tip: Un ejemplo de uso de $OFS

Publicado por urpiano en Miércoles 27 \27\UTC marzo \27\UTC 2013

En este otro Tip de Powershell, explicaba qué hace esta variable propia de Powershell; ahora voy a poner un ejemplo muy chulo que he hecho en un script en el curro.
La cosa consistía en que tenía un fichero con nombres NetBios de equipos y quería usarlo para recorrerlos obteniendo los objetos de directorio activo correspondientes. Para ello tenía que usar cada línea del fichero (pues los nombres de los equipos estaban uno por línea) como sAMAccountName agregando un dollar al final de cada nombre (el atributo sAMAccountName de un equipo siempre termina con un dollar). Para buscar los equipos utilizaría un objeto DirectorySearcher, al cual le tendría que pasar un filtro LDAP de este estilo:

"(&(ObjectClass=computer)(|(sAMAccountName=equipo1$)(sAMAccountName=equipo2$)))"

Es decir, con tantos (sAMAccountName=equipoN$) como equipos aparezcan en el fichero. Si no exitiese $OFS, el código necesario sería algo así:

$Filtro = "(&(objectClass=computer)(|"
Get-Content Equipos.txt | ForEach {
    $Filtro = "$Filtro(sAMAccountName=$_`$)"
}
$Filtro = "$Filtro))"

Como vemos, iniciamos el filtro, recorremos una a una las líneas del fichero y vamos añadiendo tantos elementos al filtro como líneas; terminado el bucle cerramos el paréntesis del OR de nombre sAMAccountName y el AND de clase de objeto más sAMAccountName.
Utilizando $OFS esto se hace sin usar un bucle, sólo estableciendo $OFS, asignando el filtro y reestableciendo $OFS:

$OFS = "`$)(sAMAccountName="
$Filtro = "(&(objectClass=computer)(|(sAMAccountName=$(Get-Content Equipos.txt)`$)))"
Remove-Variable OFS -Force

El secreto está en la definición de $OFS y el montaje final. Hay que tener en cuenta que lo establecido en $OFS sólo aparecerá entre elementos, por tanto hay que iniciar el filtro de forma que establezca el comienzo del filtro hasta la aparición del primer elemento, es decir:

(&(objectClass=computer)(|(sAMAccountName=

La definición de OFS debe tener en cuenta que ha de cerrar la definición del elemento anterior y comenzar la del presente, de forma que queda así:

`$)(sAMAccountName=

Como se ha podido observar, hay que preceder el dollar de un acento grave, para quitarle el significado y que así aparezca en el resultado final, no que sea interpretado como elemento del lenguaje.
Lo siguiente es obtener los datos con Get-Content; el resultado es un array de cadenas que al estar invocado entre comillas usará $OFS como separador de elementos:

$(Get-Content Equipos.txt)

Por último, hay que cerrar el elemento final, el OR y el AND, con lo que el cierre debe ser así:

`$))

De nuevo se ha quitado significado al dollar que se debe poner al último elemento.
El último paso es destruir OFS para que Powershell vuelva a usar el espacio como separador de elementos de array cuando está el array encerrado entre comillas:

Remove-Variable OFS -Force
About these ads

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 39 seguidores

%d personas les gusta esto: