3

我有脚本在特定目录中监视文件创建。我在创建 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"
} 
4

1 回答 1

3

如果您从同一 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. 点击“enter”以允许 Read-Host 完成

中提琴,断点命中!

于 2012-08-15T19:42:23.963 回答