Pide tu presupuesto ya!
30th October 2024
Al trabajar con PowerShell, a menudo encontrará objetos complejos con propiedades y relaciones profundamente anidadas. Si bien los objetos simples son fáciles de exportar a archivos CSV, preservar la estructura de objetos complejos requiere un enfoque diferente. Ingrese a CliXML: la forma en que PowerShell serializa y almacena objetos complejos.
En este tutorial, aprenderá cómo exportar objetos complejos de PowerShell a CliXML usando un sistema de administración de programas de entrenamiento como ejemplo. Verá cómo mantener relaciones entre objetos, manejar datos anidados y garantizar que sus exportaciones se realicen de forma segura.
Para seguir este tutorial, necesitará:
Comencemos con un ejemplo del mundo real: un sistema de gestión de programas de entrenamiento. Usaremos una función llamada Get-WorkoutProgram que devuelve datos de entrenamiento con entrenadores, rutinas y detalles de ejercicios anidados.
function Get-WorkoutProgram {
param()
@(
[pscustomobject]@{
Name = "StrengthTraining"
Trainers = @(
[pscustomobject]@{
Name = "Alex";
Specialization = "Strength Conditioning";
ExperienceYears = 5;
Certifications = @("CPT", "CSCS")
},
[pscustomobject]@{
Name = "Jordan";
Specialization = "Functional Training";
ExperienceYears = 3;
Certifications = @("CPT", "FMS Level 1")
}
)
Routines = @(
[pscustomobject]@{
Day = "Monday";
Exercises = @(
[pscustomobject]@{
Name = "Squats";
Sets = 5;
Reps = 10;
Notes = "Focus on form and depth";
Details = @{
Equipment = "Barbell";
TechniqueTips = "Keep feet shoulder-width apart and drive through the heels."
}
},
[pscustomobject]@{
Name = "Bench Press";
Sets = 4;
Reps = 8;
Notes = "Maintain a slow and controlled motion";
Details = @{
Equipment = "Bench, Barbell";
TechniqueTips = "Align wrists and elbows, lower bar to mid-chest."
}
}
)
}
[pscustomobject]@{
Day = "Wednesday";
Exercises = @(
[pscustomobject]@{
Name = "Deadlift";
Sets = 5;
Reps = 5;
Notes = "Keep your back straight";
Details = @{
Equipment = "Barbell";
TechniqueTips = "Keep the bar close to your body, lift with your legs."
}
},
[pscustomobject]@{
Name = "Pull-ups";
Sets = 3;
Reps = "Max";
Notes = "Full range of motion";
Details = @{
Equipment = "Pull-up Bar";
TechniqueTips = "Avoid swinging, pull up until chin is above the bar."
}
}
)
}
)
}
[pscustomobject]@{
Name = "CardioBlast"
Trainers = @(
[pscustomobject]@{
Name = "Mia";
Specialization = "Cardio Training";
ExperienceYears = 4;
Certifications = @("ACE", "NASM")
}
)
Routines = @(
[pscustomobject]@{
Day = "Tuesday";
Exercises = @(
[pscustomobject]@{
Name = "Treadmill Sprint";
Duration = "30min";
Notes = "High-intensity interval training";
},
[pscustomobject]@{
Name = "Cycling";
Duration = "45min";
Notes = "Steady state cycling";
}
)
}
)
}
[pscustomobject]@{
Name = "YogaFlex"
Trainers = @(
[pscustomobject]@{
Name = "Ethan";
Specialization = "Yoga and Flexibility";
ExperienceYears = 6;
Certifications = @("RYT-200", "C-IAYT")
}
)
Routines = @(
[pscustomobject]@{
Day = "Friday";
Exercises = @(
[pscustomobject]@{
Name = "Vinyasa Flow";
Duration = "60min";
Notes = "Fluid movement and breath synchronization";
},
[pscustomobject]@{
Name = "Hatha Yoga";
Duration = "60min";
Notes = "Focus on alignment and mindfulness";
}
)
}
)
}
)
}
# Get our workout program data
$workoutData = Get-WorkoutProgram
Eche un vistazo a lo que contienen estos datos:
Notarás que cada programa tiene propiedades como `Entrenadores` y `Rutinas` que contienen objetos anidados (indicados por el signo `@` y llaves). Echemos un vistazo más allá del capó con “Get-Member”:
$workoutData | Get-Member

Ver esos `Objeto[]`¿tipos para `Rutinas` y `Entrenadores`? Eso nos dice que estas propiedades contienen matrices de objetos anidados. Echemos un vistazo a los formadores del primer programa:

Ahora podemos ver que cada entrenador tiene sus propias propiedades, incluida una variedad de certificaciones. Este tipo de estructura anidada es exactamente la razón por la que necesitamos CliXML para exportar.
Exportar a CliXML es sencillo con el cmdlet `Export-Clixml`:
$workoutData | Export-Clixml -Path "WorkoutPrograms.xml"
Echemos un vistazo a lo que creó PowerShell:
Get-Content "WorkoutPrograms.xml"

El resultado puede parecer intimidante al principio: es un formato XML estructurado con etiquetas como `
¿Qué sucede si necesita exportar datos actualizados pero desea proteger su exportación original? El parámetro `-NoClobber` evita sobrescrituras accidentales:
$workoutData | Export-Clixml -Path "WorkoutPrograms.xml" -NoClobber
Si el archivo existe, PowerShell generará un error en lugar de sobrescribirlo, ¡mucho más seguro que el comportamiento predeterminado!
Cuando trabaje con exportaciones CliXML, tenga en cuenta estos consejos:
1. Utilice nombres de archivos significativos que indiquen el tipo de datos y la fecha de exportación.
2. Utilice siempre “NoClobber” cuando sea importante proteger las exportaciones existentes.
3. Recuerde que los archivos CliXML están basados en texto y se puede controlar su versión.
4. Considere comprimir archivos CliXML grandes si le preocupa el almacenamiento
CliXML es perfecto para:
Pero considere alternativas cuando:
CliXML es una poderosa herramienta para preservar objetos complejos de PowerShell. Si bien los archivos exportados pueden no ser bonitos a la vista, mantienen toda la rica estructura y relaciones de sus objetos originales. Ya sea que esté trabajando con programas de entrenamiento como nuestro ejemplo o cualquier otra estructura de datos compleja, CliXML lo tiene cubierto.
La próxima vez que necesite exportar objetos complejos de PowerShell, recuerde:
1. Verifique la estructura de su objeto con `Get-Member`
2. Utilice `Export-Clixml` para preservar todas las relaciones de objetos
3. Proteja los archivos existentes con `NoClobber`
4. Elija CliXML cuando la complejidad del objeto sea importante
Con estas herramientas en su conjunto de herramientas de PowerShell, estará listo para manejar incluso los escenarios de exportación de datos más complejos.
Leave a comment