2011-03-03 22 views
7

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?

Respuesta

9

La referencia debería funcionar, usted no dice lo que sucedió cuando lo intentó. He aquí un ejemplo:

Test.ps1:

Param ([ref]$OptionalOutput) 

"Standard output" 
$OptionalOutput.Value = "Optional Output" 

Run que:

$x = "" 
.\Test.ps1 ([ref]$x) 
$x 

aquí es una alternativa que te pueden gustar mejor.

Test.ps1:

Param ($OptionalOutput) 

"Standard output" 
if ($OptionalOutput) { 
    $OptionalOutput | Add-Member NoteProperty Summary "Optional Output" 
} 

Run que:

$x = New-Object PSObject 
.\Test.ps1 $x 
$x.Summary 
+0

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]? –

+2

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

+0

@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)? –

1

¿Está más cerca de lo que quiere hacer?

Test2.ps1

$Issues = "Potentially long list of issues" 
$SummaryLine = "37 issues found" 
$Issues 
$SummaryLine 

Test1.ps1

$MainOutput,$SummaryOutput = & ".\Test2.ps1" 
$MainOutput 
$SummaryOutput 

Este:

param([String]$SummaryLine) 
$Issues = "Potentially long list of issues" 
$SummaryLine = "37 issues found" 
$Issues 

es irracional. Está pasando un parámetro para $ SummaryLine, y luego lo reemplaza inmediatamente con "37 issues found". Esa variable solo existe en el ámbito en el que se ejecuta el script llamado. Tan pronto como el script finalice, desaparecerá. Si desea usarlo más adelante, debe generarlo y guardarlo en una variable en su secuencia de comandos de llamada.

+0

Sí, yo estaba tratando de tratar básicamente Prueba2 como una función con un parámetro "ByRef" (salida). Tu sintaxis se acerca bastante.Múltiples variables a la izquierda de = es nuevo para mí, pero creo que lo entiendo: [Multi Variable Assignment] (http://get-powershell.com/2008/02/05/multi-variable-assignment-in-powershell /). La única "característica" adicional que me gustaría es poder llamar a Test2 _sin_ ver la $ SummaryLine. En otras palabras, el valor predeterminado sería devolver solo el detalle $ Issues. Supongo que para eso podría pasar un parámetro booleano $ ShowSummary y solo sacar el $ SummaryLine si $ ShowSummary = True. –

+0

Usaría un parámetro [cambiar], en lugar de un booleano. – mjolinor

Cuestiones relacionadas