Tengo un script de PowerShell (2.0) llamando a otro. Deseo recibir no solo el resultado principal, sino un objeto adicional que puedo usar por separado, p. Ej. para mostrar una línea de resumen en un mensaje.¿Devuelve objeto de PowerShell usando un parámetro (parámetro "Por referencia")?
Tengamos Test2.ps1 que el script se llama:
param([String]$SummaryLine)
$Issues = "Potentially long list of issues"
$SummaryLine = "37 issues found"
$Issues
Y Test1.ps1 que el script que llama:
$MainOutput = & ".\Test2.ps1" -SummaryLine $SummaryOutput
$MainOutput
$SummaryOutput
La salida es simplemente:
Potentially long list of issues
Aunque el parámetro $ SummaryLine se rellena con Test2, $ SummaryOutput permanece indefinido en Test1.
Definiendo $ SummaryOutput antes de llamar Test2 no ayuda; solo conserva el valor asignado antes de llamar a Test2.
He intentado configurar $ SummaryOutput y $ SummaryLine como variables [ref] (como aparentemente se puede hacer con las funciones), pero la propiedad $ SummaryOutput.Value es $ null después de llamar a Test2.
¿Es posible en PowerShell devolver un valor en un parámetro? Si no, ¿cuáles son las soluciones? ¿Asignando directamente una variable de ámbito parental en Test2?
Holy cow, [ref] funciona! Cuando lo intenté, asigné $ OptionalOutput en lugar de $ OptionalOutput.Value dentro del script llamado, por lo que $ x no se actualizó en el script de llamada. Entonces, ¿qué está pasando en su segundo enfoque? Si $ x es un PSObject, se pasa automáticamente como [ref]? –
Sugiero usar [ref] y no la segunda opción. En PowerShell (como .NET), los objetos se pasan por referencia, pero las variables tienen un ámbito. Eso puede ser difícil de entender al principio, pero es cierto. – JasonMArcher
@JasonMArcher: Sí, me gusta [ref] por ser más explícito. Re. pasando objetos, si todos los objetos se pasan por referencia, ¿por qué no funciona para una cadena (que es un objeto de tipo de referencia .NET)? –