【问题标题】:Powershell debugging event -Action code blockPowershell 调试事件 -Action 代码块
【发布时间】:2012-08-14 19:51:43
【问题描述】:

我在特定目录中有脚本监视文件创建。 我在创建 System.IO.FileSystemWatcher 后使用 Register-ObjectEvent,

效果很好,但是如果我在 -Action 代码块中设置断点,IDE 会生成:

警告:'D:\My Stuff\Desktop\scripts\fileWatcher.ps1:15' 上的断点行断点不会被命中

此消息在我将文件放入我正在查看的目录后立即发生,并且我可以看到我的 Write-Host 在上述“警告”之后立即打印出我的消息。

这正常吗?
我需要添加更多代码并且可以真正使用调试器.. 我该怎么做才能调试这个代码块?

$fsw = [System.IO.FileSystemWatcher] $path

Register-ObjectEvent -InputObject $fsw –EventName Created -SourceIdentifier DDFileCreated -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
    Out-File -FilePath $logFile -Append -InputObject "The file '$name' was $changeType at $timeStamp"
} 

【问题讨论】:

    标签: powershell-ise


    【解决方案1】:

    如果您在同一 ISE 或控制台会话中通过直接 powershell 命令触发事件,它实际上会起作用:

    $path = (Resolve-Path '~\').Path
    if(Test-Path "$path\newfile.txt"){ del "$path\newfile.txt" }
    
    $fsw = [System.IO.FileSystemWatcher] $path
    
    Register-ObjectEvent -InputObject $fsw –EventName Created -SourceIdentifier DDFileCreated -Action { 
        $name = $Event.SourceEventArgs.Name  # put breakpoint here, via ISE or script
        $changeType = $Event.SourceEventArgs.ChangeType 
        $timeStamp = $Event.TimeGenerated 
        Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
    }
    
    'foo' | out-file "$path\newfile.txt"   # breakpoint hit
    

    但是,如果您只是连接事件并等待某个外部进程创建文件,我会看到您遇到的问题。

    因此,如果您可以添加一些测试代码来直接触发您的事件,那就去吧。

    如果没有,请继续阅读...

    您似乎无法在 shell 或 ISE 等待新命令时进入调试器,您只能在 另一个命令正在执行时输入

    按照这个理论,这是解决方法(对我有用):

    1. 设置断点
    2. 运行您的事件订阅代码
    3. 在 ISE 控制台窗口中运行命令“Read-Host”,或从 shell 提示符中运行
    4. 等到您知道您的事件应该由于外部进程而被触发
    5. 点击“回车”以允许读取主机完成

    Viola,断点命中!

    【讨论】:

    • 谢谢,至少我现在知道不是我。我用老式调试器(Write-Host 的船载)“调试它”。
    • 我遇到了同样的问题...并且无法从我的对象事件中获取调试消息或调试。我尝试了你的方法,但它不起作用......stackoverflow.com/q/70491917想法?
    【解决方案2】:

    真正的关键是运行一个循环,这样脚本就永远不会退出。然后调试和断点工作。

    例如

    # At the end of the script.
    while ($true) {
        Start-Sleep -Seconds 1
    }
    

    更多细节是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多