我正在尝试记录用户在目录中停留的时间。有人打电话Set-Location
时,有没有办法拦截事件?
答案 0 :(得分:6)
我还发布了powershell technet forumn并获得了a great answer。简而言之,您可以在powershell中的任何对象上设置断点。使用断点,您可以关联一个代码块(或省略该块以暂停执行)。更酷的部分是powershell提供了一个代表当前工作目录的pwd
全局对象。您可以在此全局对象上的所有“写入”操作上设置断点。
它基本上是观察者模式或AOP。最好的部分是这将适用于任何更改当前目录的内容 - cd
,pushd
,popd
等。这是我的C#cmdlet代码:
InvokeCommand.InvokeScript(@"Set-PSBreakpoint -Variable pwd -Mode Write -Action {
[Jump.Location.JumpLocationCommand]::UpdateTime($($(Get-Item -Path $(Get-Location))).PSPath);
}");
我正在调用静态方法来跟踪时间。我想我可能只是喜欢C#:(
答案 1 :(得分:3)
我建议使用Prompt功能(用于显示提示信息)。在那里我会调用get-location来获取当前位置并将其与我存储之前位置的全局变量进行比较。基于此,您可以计算时间并对其进行任何处理。
有关提示功能的更多信息,请参阅以下页面(例如):
答案 2 :(得分:1)
您可以使用ValidateScript
属性(由@oising提出)实现它:
$n = 0; (Get-Variable pwd).attributes.Add((new-object ValidateScript { $global:n++; $true }))
Scriptblock { $global:n++; $true }
将在每个'上执行。对于$pwd
变量。它类似于断点方法,但没有性能下降。