我正在尝试记录用户在目录中停留的时间。有没有办法在有人打电话时拦截事件Set-Location
?
问问题
412 次
3 回答
6
我还发布到 powershell technet forumn 并得到了很好的答案。简而言之,您可以在 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# :(
于 2012-08-05T02:35:12.203 回答
3
我会推荐使用提示功能(用于显示提示信息)。在那里,我会调用 get-location 来获取当前位置并将其与存储先前位置的全局变量进行比较。基于此,您可以计算时间并对其进行任何处理。
有关提示功能的更多信息,请参见以下页面(例如):
于 2012-08-03T03:23:05.333 回答
1
您可以使用ValidateScript
属性(由@oising 提出)来实现它:
$n = 0; (Get-Variable pwd).attributes.Add((new-object ValidateScript { $global:n++; $true }))
脚本块{ $global:n++; $true }
将在$pwd
变量的每个“集合”上执行。它类似于断点方法,但没有性能下降。
于 2014-09-24T01:06:19.850 回答