2012-01-26 11 views
10

Si intento examinar la variable automática PowerShell $PSBoundParameters durante una sesión de depuración de PowerShell (por ejemplo, PowerShell ISE o Quest PowerGUI Script Editor), no puedo recuperar su valor. Sin embargo, si simplemente dejo que la función repita el objeto $PSBoundParameters en la tubería, se muestra como se esperaba.

¿Alguien sabe por qué es esto? Esperaría poder examinar todas las variables dentro del alcance durante una sesión de depuración, ya sean automáticas o definidas por el usuario.

Respuesta

3

parece que funciona para mí si le asigno a una variable y miro a la variable de la siguiente manera:

function Test-PSBoundParameters { 
    [CmdletBinding()] 
    param (
     [string] $Bar 
    ) 

    $test = $PSBoundParameters 
    $test | select * 
} 

Test-PSBoundParameters -Bar "a" 

no pude inspeccionar $PSBoundParameters durante la depuración pero pude inspeccionar $test. No estoy seguro de por qué es esto, pero al menos puedes usar esto como un trabajo alternativo.

+0

Hmmmm que es una buena solución temporal, pero todavía no responde a la cuestión central, por lo que esa variable no está disponible en el contexto de depuración. –

2

Puede obtener más información sobre $PSBoundParameters en about_Automatic_Variables. Esta variable tiene un valor solo en un ámbito donde se declaran los parámetros. Por lo que respecta a PowerGui, puedo ver los valores de esta var durante la depuración, como se puede ver a continuación.

enter image description here

que acaba de ver nada dentro [DBG] porque no estás en un lugar intereactive debido a una función sin argumentos.

+0

Pero, ¿por qué la variable $ PSCmdlet está disponible en el contexto de depuración? Es la misma situación que $ PSBoundParameters ... es una variable automática que solo existe en el alcance de la función. –

+0

Simplemente porque [DBG] se obtiene al invocar una función y no un Cmdlet, por lo que $ PSCmdlet no se sobrescribe. Mira en mi ejemplo $ PSCmdLet es $ null. – JPBlanc

+0

Creo que en su ejemplo, $ PSCmdlet es $ null porque no está utilizando el atributo [CmdletBinding()] en su función. Su función es lo que se conoce como una función "v1", no una función avanzada de v2. –

15

He aquí por qué, desde about_debuggers:

 
Displaying the Values of script Variables 

While you are in the debugger, you can also enter commands, display the 
value of variables, use cmdlets, and run scripts at the command line. 

You can display the current value of all variables in the script that is 
being debugged, except for the following automatic variables: 

    $_ 
    $Args 
    $Input 
    $MyInvocation 
    $PSBoundParameters 

If you try to display the value of any of these variables, you get the 
value of that variable for in an internal pipeline the debugger uses, not 
the value of the variable in the script. 

To display the value these variables for the script that is being debugged, 
in the script, assign the value of the automatic variable to a new variable. 
Then you can display the value of the new variable. 
Cuestiones relacionadas