PowerShell 技能连载 - 同步使用 FileSystemWatcher

以下是一段演示 PowerShell 如何用 FileSystemWatcher 同步地监控一个包含字文件夹的文件夹变化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$folder = $home
$filter = '*'


try
{
$fsw = New-Object System.IO.FileSystemWatcher $folder, $filter -ErrorAction Stop
}
catch [System.ArgumentException]
{
Write-Warning "Oops: $_"
return
}

$fsw.IncludeSubdirectories = $true
$fsw.NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'

do
{
$result = $fsw.WaitForChanged([System.IO.WatcherChangeTypes]::All, 1000)
if ($result.TimedOut) { continue }

$result
Write-Host "Change in $($result.Name) - $($result.ChangeType)"

} while ($true)

这段代码将会监测用户配置文件中 FileNameLastWrite 属性的变化。

一个同步的监听器会导致 PowerShell 处于忙碌状态,所以要退出监听,需要设置一个 1000ms 的超时值,PowerShell 将会将控制权返回给你,而如果您没有按下 CTRL+C,则循环会继续。

请注意同步的 FileSystemWatcher 可能会错过改变:正好当 WaitForChange() 返回时一个文件发生改变,那么在下一次调用 WaitForChange() 之前的文件变化都会丢失。

如果不想错过任何变化,请使用异步的方法(请见下一个技能)。

评论