如何检测用户在PowerShell中停留在一个位置的时间

时间:2012-08-03 01:40:38

标签: powershell filesystems

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

3 个答案:

答案 0 :(得分:6)

我还发布了powershell technet forumn并获得了a great answer。简而言之,您可以在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#:(

答案 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变量。它类似于断点方法,但没有性能下降。