Powershell调试事件-Action代码块

Pab*_*blo 5 powershell-ise

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

\n\n

它工作得很好,但如果我在 -Action 代码块中设置断点,IDE 会生成:

\n\n

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

\n\n

在我将文件放入我正在监视的目录中后,此消息立即发生,并且我可以看到我的写入主机在上述“警告”之后立即打印出我的消息。

\n\n

这是正常的吗?
\n我需要添加更多代码并且可以真正使用调试器..\n我应该做什么,以便我可以调试此代码块?

\n\n
$fsw = [System.IO.FileSystemWatcher] $path\n\nRegister-ObjectEvent -InputObject $fsw \xe2\x80\x93EventName Created -SourceIdentifier DDFileCreated -Action { \n    $name = $Event.SourceEventArgs.Name \n    $changeType = $Event.SourceEventArgs.ChangeType \n    $timeStamp = $Event.TimeGenerated \n    Write-Host "The file \'$name\' was $changeType at $timeStamp" -fore green \n    Out-File -FilePath $logFile -Append -InputObject "The file \'$name\' was $changeType at $timeStamp"\n} \n
Run Code Online (Sandbox Code Playgroud)\n

lat*_*kin 4

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

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

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

\n\n

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

\n\n

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

\n\n

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

\n\n

根据该理论,这就是解决方法(对我有用):

\n\n
    \n
  1. 设置断点
  2. \n
  3. 运行您的事件订阅代码
  4. \n
  5. 在 ISE 控制台窗口中或从 shell 中的提示符运行命令“Read-Host”
  6. \n
  7. 等到您知道您的事件应该由于外部进程而触发
  8. \n
  9. 按“Enter”以允许 Read-Host 完成
  10. \n
\n\n

维奥拉,断点命中!

\n