2012-04-11 4 views
5

Según MSDN:Declarar obtener descriptores de acceso en los parámetros de cmdlet de PowerShell

"Parámetros debe declararse en los campos no estáticos públicos o propiedades parámetros deben ser declaradas en las propiedades La propiedad debe tener un conjunto público.. acceso, y si se especifica la palabra clave ValueFromPipeline o ValueFromPipelineByPropertyName, la propiedad debe tener un acceso público get. "

¿Por qué tengo que declarar obtener descriptores de acceso en mi cmdlet ValueFromPipeline parámetros? Hasta donde yo sé, PowerShell solo necesita poner sus valores, no leerlos. Gracias (por cierto tengo curiosidad sobre este comportamiento :)).

+0

Parece un requisito extraño. Solo puedo suponer que es un artefacto de implementación (es decir, abstracción con goteras): el seguimiento del código cuando se trata de validaciones y conversiones de tipo aplicadas a propiedades de parámetros muestra que el procesamiento no es simple. Por otro lado, rara vez he usado otra cosa que no sea una propiedad automática con public set y get y no puedo pensar en una circunstancia en la que quisiera algo más. – Richard

Respuesta

3

PowerShell lee el valor por defecto de los parámetros marcados con ValueFromPipeline o ValueFromPipelineByPropertyName para hacer una copia de seguridad antes de asignar el nuevo valor obtenido de the pipeline.

considerar los siguientes cmdlets:

New-Post -Title <string> 
Set-Post -InputObject <Post> -Title <string> 

donde se aplica lo siguiente:

  • la New-Post cmdlet vuelve la Post objeto recién creado a la tubería, que tiene un Title propiedad
  • la InputObject propiedad o n el cmdlet Set-Post está marcado con ValueFromPipeline = true
  • la propiedad Title en el cmdlet Set-Post está marcada con ValueFromPipelineByPropertyName = true.

ellos combinación con el siguiente comando:

New-Post -Title "Foo" | Set-Post 

y establecer un punto de interrupción en el acceso get de Title resultados de propiedad del Set-Post de cmdlet en el seguimiento de pila:

Stack trace for parameter binding in PowerShell

Como puede ver, se invoca el método CmdletParameterBinderController.GetDefaultParameterValue durante el proceso de vinculación del Title propiedad en el cmdlet Set-Post con el valor de la propiedad correspondiente en el objeto procedente de la canalización.

+0

+1 Por citar el principio de menos asombro. –

+0

-1. Si bien esto tiene una lógica, no es así como funciona PSH. Dentro del cmdlet se llama 'WriteObject' para pasar objetos (o colecciones) al siguiente paso de la canalización. – Richard

+0

@Richard Creo que malinterpretaste mi punto.No estoy hablando de detener el paso del objeto completo a través de la tubería, sino más bien * la asignación automática de parámetros * con el mismo nombre. PowerShell no podría recuperar el valor asignado a los parámetros de un cmdlet si las propiedades correspondientes fueran * solo escritura *. –

Cuestiones relacionadas