Powershell调试事件 - 动作代码块

时间:2012-08-14 19:51:44

标签: powershell-ise

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

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

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

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

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

$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"
} 

1 个答案:

答案 0 :(得分:2)

如果您在同一个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. 等到你知道你的事件应该因外部过程而被解雇
  6. 点击“enter”以允许Read-Host完成
  7. Viola,断点击中!