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: Separación Automática de Arrays – $OFS

Posted by urpiano en Miércoles 25 \25\UTC abril \25\UTC 2012

Una prestación muy cómoda de PowerShell consiste en que puede poner todos los valores de un array de forma automática en una cadena, con los valores separados por espacios ¿Es posible que esto lo haga separando por un tabulador, por ejemplo? Sí, es perfectamente posible y es lo que vamos a ver en este Tip.

“Existe” una variable integrada de PowerShell llamada ofs que establece, precisamente, el separador de los arrays cuando son incluídos dentro de una cadena; entrecomillo el existe porque si listamos las variables que están definidas en una consola de PowerShell no estará la variable ofs:

PS D:\> dir variable:o*

Name                           Value
----                           -----
OutputEncoding                 System.Text.ASCIIEncoding

Si en estas condiciones pasamos un array dentro de una cadena, el separador de elementos del array será el espacio:

PS D:\> $Array = (1..10)
PS D:\> "$Array"
1 2 3 4 5 6 7 8 9 10

Sin embargo, si damos valor a la variable ofs veremos cómo ésta actua tal y como decíamos. Veremos, por ejemplo si ponemos de separador un espacio, un guión y otro espacio:

PS D:\> $ofs = " - "
PS D:\> "$Array"
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10

O una arroba:

PS D:\> $ofs = "@"
PS D:\> "$Array"
1@2@3@4@5@6@7@8@9@10

O un tabulador, tal y como decíamos al principio (el tabulador se establece con un acento grave seguido de una “t”; más información en el tema de ayuda about_Special_Characters):

PS D:\> $ofs = "`t"
PS D:\> "$((1..10))"
1       2       3       4       5       6       7       8       9       10

¿Cómo podemos volver a la situación inicial? Pues tenemos dos formas, dando a ofs como valor el espacio o eliminando ofs, lo que es mejor, pues se vuelve a la situación por defecto:

PS D:\> $ofs = " "
PS D:\> "$Array"
1 2 3 4 5 6 7 8 9 10
PS D:\> $ofs = "~"
PS D:\> "$Array"
1~2~3~4~5~6~7~8~9~10
PS D:\> Remove-Variable ofs
PS D:\> "$Array"
1 2 3 4 5 6 7 8 9 10

A continuación pongo un pequeño script que muestra esto. El script define un hastable al que puebla con elementos cuyos valores son arrays. Muestra varias veces el hastable cambiando el separador predeterminado y por último elimina ofs:

# Definimos el hastable
$HasTable = @{}

# Lo poblaremos con 10 elementos
For($i = 0; $i -lt 10;$i++)
{
    # Obtenemos un array de tres elementos, cuyo valor será aleatorio entre 10 y
    # 15
    $Array = (Get-Random -Maximum 15 -Minimum 10), `
             (Get-Random -Maximum 15 -Minimum 10), `
             (Get-Random -Maximum 15 -Minimum 10)
             
    # Agregamos el elemento con el array como valor
    $HasTable.Add("Elemento $("{0:D2}" -f ($i + 1))",$Array)
}

# Una vez poblado el hastable, lo ordenamos (señalar que con esta operación
# cambia la variable $Hastable de hastable a array de DictionaryEntry, por lo
# que luego, a la hora de recorrerlo, no podemos usar las colecciones Keys o
# values)
$HasTable = $HasTable.GetEnumerator() | Sort-Object Name

# ofs no existe aún, y por tanto el separador es el espacio
"Separado por espacio"
# Mostramos los elementos
ForEach($Elemento In $HasTable)
{
    "$($Elemento.key) : $($Elemento.value)"
}
# Vamos a establecer la coma seguida de un espacio como separador
$ofs = ", "
""
"Separado por coma y espacio"
# Mostramos los elementos
ForEach($Elemento In $HasTable)
{
    "$($Elemento.key) : $($Elemento.value)"
}
# Vamos a establecer el tabulador como separador
$ofs = "`t"
""
"Separado por tabulador"
# Mostramos los elementos
ForEach($Elemento In $HasTable)
{
    "$($Elemento.key) : $($Elemento.value)"
}
# Dejamos el espacio como separador
Remove-Variable ofs
""
"Separado por espacio"
# Mostramos los elementos
ForEach($Elemento In $HasTable)
{
    "$($Elemento.key) : $($Elemento.value)"
}

La ejecución de este script muestra este resultado:

Elemento 01 : 13 13 12
Elemento 02 : 10 12 13
Elemento 03 : 10 10 12
Elemento 04 : 10 14 12
Elemento 05 : 11 10 11
Elemento 06 : 13 10 10
Elemento 07 : 12 10 11
Elemento 08 : 13 12 11
Elemento 09 : 11 14 10
Elemento 10 : 11 14 13

Separado por coma y espacio
Elemento 01 : 13, 13, 12
Elemento 02 : 10, 12, 13
Elemento 03 : 10, 10, 12
Elemento 04 : 10, 14, 12
Elemento 05 : 11, 10, 11
Elemento 06 : 13, 10, 10
Elemento 07 : 12, 10, 11
Elemento 08 : 13, 12, 11
Elemento 09 : 11, 14, 10
Elemento 10 : 11, 14, 13

Separado por tabulador
Elemento 01 : 13        13      12
Elemento 02 : 10        12      13
Elemento 03 : 10        10      12
Elemento 04 : 10        14      12
Elemento 05 : 11        10      11
Elemento 06 : 13        10      10
Elemento 07 : 12        10      11
Elemento 08 : 13        12      11
Elemento 09 : 11        14      10
Elemento 10 : 11        14      13

Separado por espacio
Elemento 01 : 13 13 12
Elemento 02 : 10 12 13
Elemento 03 : 10 10 12
Elemento 04 : 10 14 12
Elemento 05 : 11 10 11
Elemento 06 : 13 10 10
Elemento 07 : 12 10 11
Elemento 08 : 13 12 11
Elemento 09 : 11 14 10
Elemento 10 : 11 14 13

3 comentarios to “PowerShell Tip: Separación Automática de Arrays – $OFS”

  1. JIMMY MORENO said

    Cuando creo usuarios a traves de comandos de powershell en un active directory y especifico la unidades organizativa y si esta esta separada por espacios me sale el error ya que lo esta tomando como dos cadenas…como puedo resolver este problema sin ser necesario agregar guiones u otros caracteres

  2. […] este otro Tip de Powershell, explicaba qué hace esta variable de propia de Powershell; ahora voy a poner un ejemplo muy chulo […]

Responder

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

 
A %d blogueros les gusta esto: