4

我正在尝试记录用户在目录中停留的时间。有没有办法在有人打电话时拦截事件Set-Location

4

3 回答 3

6

我还发布到 powershell technet forumn 并得到了很好的答案。简而言之,您可以在 powershell 中的任何对象上设置断点。使用断点,您可以关联代码块(或省略代码块以暂停执行)。更酷的部分是 powershell 提供了一个pwd代表当前工作目录的全局对象。您可以在此全局对象上的所有“写入”操作上设置断点。

它基本上是一种观察者模式或 AOP。最好的部分是这将适用于更改当前目录的任何内容 - cdpushdpopd等。这是我的 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 回答