代码之家  ›  专栏  ›  技术社区  ›  Sam Harwell

调试PowerShell cmdlet时出现问题

  •  11
  • Sam Harwell  · 技术社区  · 15 年前

    我正在Windows7 64位Professional上使用VisualStudio2010。调试自定义PowerShell cmdlet时遇到问题。

    • 语言:C#,目标是.NET Framework 3.5 SP1。
    • 平台目标:任何CPU
    • 开始操作: C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
    • 命令行参数: -noexit -command Add-PSSnapIn MyCustomSnapIn

    按F5键时无法连接(调试→开始调试)

    • PowerShell打开,任务管理器指示powershell.exe正在作为64位进程运行。Image Path Name列显示在Start操作中指定的相同可执行文件。
    • 如果在visualstudio中选择Debug→Break All,将收到一条消息“cannot to Break execution”。此进程当前没有执行您选择要调试的代码类型。“

    按Ctrl+F5时意外启动为32位进程(Debug→Start Without Debug)

    • PowerShell打开。任务管理器指出powershell.exe作为32位进程运行-这次映像路径名称显示SysWOW64重定向。

    我发现调试cmdlet的唯一方法是按F5键,然后选择“调试”→“全部分离”,然后选择“调试”→“附加到进程”并重新附加VisualStudio。

    7 回复  |  直到 15 年前
        1
  •  6
  •   zavis    14 年前

    问题1:

    https://connect.microsoft.com/VisualStudio/feedback/details/539389/debugging-powershell-cmdlet-from-vs-2010-does-not-stop-at-breakpoints?wa=wsignin1.0

    使用VS2008应该会有所帮助。

    更新: 我发现 调试powershell cmdlet的更方便的方法 . 在解决方案资源管理器中右键单击解决方案节点->添加->新建项目->选择powershell.exe文件(C:\Windows\SysWOW64\WindowsPowerShell\v1.0\父进程). 将新添加的项目设置为启动项目(右键单击并选择“设置为启动项目”)。然后转到项目属性(右键单击项目节点并选择“属性”),并将“调试器类型”属性设置为“托管(v2.0,v1.1,v1.0)”。不要忘记注册提供程序或CmdLet(通过运行生成后事件,请参阅 http://msdn.microsoft.com/en-us/library/ms714644%28v=vs.85%29.aspx

        2
  •  2
  •   Keith Hill    15 年前

    关于问题2,由于visualstudio是在WOW64上运行的32位进程,因此 C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe 已重定向到 C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

        3
  •  2
  •   Jim    14 年前

    我知道这个帖子已经发布了一年了,但它可能会帮助其他人解决这个问题。

    有了PS 2.0你 必须使用安装cmdlet 安装工具 . 相反,你可以使用 Import-Module 相反(这是 需要管理员权限)。我将不详细介绍如何做到这一点,因为网络搜索将揭示大多数细节,但简而言之,您需要在以下位置创建一个文件夹(如果它还不存在):

    md (Join-Path (Split-Path $profile) modules)
    

    在modules文件夹下,创建另一个与cmdlet DLL(minus.DLL)同名的文件夹。此文件夹将包含二进制文件和描述DLL的psd1文件(请参阅 Module Manifests ). 为了方便起见,我创建了这个文件夹作为指向我的projects bin\debug文件夹的文件夹符号链接。

    设置断点并继续。PowerShell启动后,键入:

    Import-Module <ModuleName>
    

    然后运行cmdlet。


    样品

    C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.dll 
    C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.pdb
    C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.psd1
    C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.Types.ps1xml (etc.)
    

    在PowerShell类型中(也可以放在您的配置文件中):

    Import-Module MyCmdlet
    

    对我来说,这会命中所有断点,也会在出现异常时停止。无需附加到进程等。

        4
  •  1
  •   x0n    15 年前

        5
  •  0
  •   Sam Harwell    15 年前

    我可以通过创建文件夹来解决问题2 C:\dev\PowerShell\x64 把所有的东西都从 C:\Windows\System32\WindowsPowerShell\v1.0 我喜欢它。我创建了一个类似的文件夹 C:\dev\PowerShell\x86 . 当我指定这些路径时,PowerShell的预期版本总是启动的,因此启动调试的最短方法现在是在不调试的情况下启动,然后附加到进程。

        6
  •  0
  •   Dan R    15 年前

    在调用Add PSSnapin使其在调试会话中可用之前,您没有提到如何安装插件。

    确保正在使用安装插件 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe ,而不是…\Framework。。。-这让我难堪了好几天。

        7
  •  0
  •   banbh    13 年前