2012-01-26 37 views
10

Nếu tôi cố gắng kiểm tra biến tự động PowerShell $PSBoundParameters trong phiên gỡ lỗi PowerShell (ví dụ: PowerShell ISE hoặc Trình soạn thảo kịch bản Quest PowerGUI), tôi không thể truy lục giá trị của nó. Tuy nhiên, nếu tôi chỉ đơn giản cho phép hàm lặp lại đối tượng $PSBoundParameters đến đường ống, hàm sẽ hiển thị như mong đợi.

Có ai biết tại sao điều này không? Tôi hy vọng sẽ có thể kiểm tra tất cả các biến trong phạm vi trong một phiên gỡ lỗi, cho dù chúng là tự động hay do người dùng định nghĩa.

Trả lời

3

Có vẻ như để làm việc cho tôi nếu tôi gán nó vào một biến và nhìn vào biến như thế này:

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

    $test = $PSBoundParameters 
    $test | select * 
} 

Test-PSBoundParameters -Bar "a" 

tôi không thể kiểm tra $PSBoundParameters khi gỡ lỗi nhưng tôi có thể kiểm tra $test. Tôi không chắc chắn tại sao điều này, nhưng ít nhất bạn có thể sử dụng điều này như một công việc xung quanh.

+0

Hmmmm đó là một công việc xung quanh tốt, nhưng nó vẫn không trả lời những vấn đề cốt lõi, đó là lý do biến mà không có sẵn trong bối cảnh gỡ lỗi. –

2

Bạn có thể có thêm thông tin liên quan đến $PSBoundParameters trong about_Automatic_Variables. Biến này chỉ có giá trị trong phạm vi nơi các tham số được khai báo. Vì vậy, theo như PowerGui là có liên quan tôi có thể thấy các giá trị của var này trong quá trình gỡ lỗi như bạn có thể thấy dưới đây.

enter image description here

Bạn chỉ nhìn thấy gì bên trong [DBG] vì có bạn đang ở trong một nơi intereactive do một hàm không có đối số.

+0

Nhưng tại sao biến $ PSCmdlet có sẵn trong bối cảnh gỡ lỗi? Đó là tình huống tương tự như $ PSBoundParameters ... đó là một biến tự động chỉ tồn tại trong phạm vi chức năng. –

+0

Chỉ vì [DBG] thu được bằng cách gọi hàm và không phải là lệnh Cmdlet nên $ PSCmdlet không được ghi đè. Nhìn vào ví dụ của tôi $ PSCmdLet là $ null. – JPBlanc

+0

Tôi nghĩ rằng trong ví dụ của bạn, $ PSCmdlet là $ null bởi vì bạn không sử dụng thuộc tính [CmdletBinding()] trên hàm của bạn. Hàm của bạn là hàm được gọi là hàm "v1" chứ không phải hàm nâng cao v2. –

15

Dưới đây là lý do tại sao, từ 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. 
Các vấn đề liên quan