【问题标题】:PowerShell Debug Invoke-CommandPowerShell 调试调用命令
【发布时间】:2015-02-06 09:11:38
【问题描述】:

我正在尝试找到一种在ScriptBlockInvoke-Command 中达到峰值的简单方法。我已经阅读了Hey Scripting Guy 博客,但它们只调用脚本文件,我对如何做到这一点有点困惑。

谁能告诉我如何让调试器停在$Var = 5 行?我试过Set-PSBreakpoint,但总是失败。这将方便检查值以及所有代码是否正确。

代码示例:

$session = New-PSSession -ComputerName localhost

Invoke-Command -Session $session -ScriptBlock $LoadFunctions

# Do other stuff

Invoke-Command -Session $session -ScriptBlock { 

    $Time = Get-Date
    $Var = '5' # Stop debugger here

    Set-PSBreakpoint -Variable $Var
}

Remove-PSSession $Session

感谢您的帮助。

【问题讨论】:

    标签: debugging powershell remote-debugging


    【解决方案1】:

    这对我有用。顺便说一句,我在 PowerShell 4.0 中。

    首先,我将 set-psbreakpoint 放在较早的脚本块中:

    Invoke-Command -ComputerName . -ScriptBlock { 
      Set-PSBreakpoint -Variable metoo; 
      $test="foo"; 
      $one="1"; 
      $metoo="metoo";
    } -Credential (Get-Credential)
    

    当我运行它时,我收到以下消息:

    WARNING: Session Session8 with instance ID 4a02c5f4-b333-4e58-85b7-78ccd4f31318 on computer localhost has been
    disconnected because the script running on the session has stopped at a breakpoint. Use the Enter-PSSession cmdlet on
    this session to connect back to the session and begin interactive debugging.
    WARNING: Session Session8 with instance ID 4a02c5f4-b333-4e58-85b7-78ccd4f31318 has been created for reconnection.
    

    所以为了看到会话仍然存在,我做了一个 Get-PSSession:

    > Get-PSSession
    
    Id Name            ComputerName    State         ConfigurationName     Availability
     -- ----            ------------    -----         -----------------     ------------
      9 Session8        localhost       Disconnected  Microsoft.PowerShell          None
    

    太好了,会话在那里,只需要重新连接并进入:

    > Get-PSSession | Connect-PSSession
    
     Id Name            ComputerName    State         ConfigurationName     Availability
     -- ----            ------------    -----         -----------------     ------------
      9 Session8        localhost       Opened        Microsoft.PowerShell   RemoteDebug
    

    并进入会话:

    > Get-PSSession | Enter-PSSession
    WARNING: You have entered a session that is currently stopped at a debug breakpoint inside a running command or script.
      Use the Windows PowerShell command line debugger to continue debugging.
    Entering debug mode. Use h or ? for help.
    
    Hit Variable breakpoint on ':$metoo' (Write access)
    
    At line:1 char:59
    +  Set-PSBreakpoint -Variable metoo; $test="foo"; $one="1"; $metoo="metoo";
    +                                                           ~
    [localhost]: [DBG]: PS C:\Users\Foo\Documents>>
    

    太好了,现在我正在我的远程调试会话中!只需按照提示操作,例如输入“h”获取帮助或输入“k”获取-psscallstack 等

    [localhost]: [DBG]: PS C:\Users\Foo\Documents>> h
    
     s, stepInto         Single step (step into functions, scripts, etc.)
     v, stepOver         Step to next statement (step over functions, scripts, etc.)
     o, stepOut          Step out of the current function, script, etc.
    
     c, continue         Continue operation
     q, quit             Stop operation and exit the debugger
    
     k, Get-PSCallStack  Display call stack
    
     l, list             List source code for the current script.
                         Use "list" to start from the current line, "list <m>"
                         to start from line <m>, and "list <m> <n>" to list <n>
                         lines starting from line <m>
    
     <enter>             Repeat last command if it was stepInto, stepOver or list
    
     ?, h                displays this help message.
    
    
    For instructions about how to customize your debugger prompt, type "help about_prompt".
    
    [localhost]: [DBG]: PS C:\Users\Foo\Documents>>
    

    【讨论】:

    • 感谢您的帮助,但是当我尝试使用更复杂的代码时,我收到以下错误消息:Breakpoints cannot be set in the remote session because remote debugging is not supported by the current host. + CategoryInfo : NotImplemented: (:) [Set-PSBreakpoint], PSNotSupportedException + FullyQualifiedErrorId : SetPSBreakpoint:RemoteDebuggerNotSupported,Microsoft.PowerShell.Commands.SetPSBreakpointCommand 尽管我也在 Windows 上使用 PowerShell 4.0本地主机上的 2008 R2 服务器。
    • 这是来自 PowerShell ISE 的错误。在普通的 PowerShell 控制台中尝试后,它确实告诉我有一个打开的会话,就像你一样。但是在Set-PSBreakpoint 之后的几个Invoke-Commands 之后,Get-PSSession CmdLet 不再给我任何打开的会话来连接..
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2015-04-22
    • 2020-11-17
    相关资源
    最近更新 更多