这是我在我的 sn-ps 中找到的一个示例。希望它更全面一点。
首先,您需要创建一个文件系统观察者,然后订阅观察者正在生成的事件。此示例侦听“创建”事件,但可以轻松修改以注意“更改”。
$folder = "C:\Users\LOCAL_~1\AppData\Local\Temp\3"
$filter = "*.LOG"
$Watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $Watcher -EventName Created -SourceIdentifier FileCreated -Action {
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$name' was $changeType at $timeStamp"
Write-Host $path
#Move-Item $path -Destination $destination -Force -Verbose
}
我会尽量缩小范围以满足您的要求。
如果您将其作为“profile.ps1”脚本的一部分运行,您应该阅读The Power of Profiles,其中解释了可用的不同配置文件脚本等等。
另外,您应该了解,等待文件夹中的更改不能作为脚本中的函数运行。必须完成配置文件脚本,您的 PowerShell 会话才能开始。但是,您可以使用函数来注册事件。
它的作用是注册一段代码,每次触发事件时执行。此代码将在会话保持打开时在当前 PowerShell 主机(或 shell)的上下文中执行。它可以与主机会话交互,但不知道注册代码的原始脚本。在您的代码被触发时,原始脚本可能已经完成。
代码如下:
Function Register-Watcher {
param ($folder)
$filter = "*.*" #all files
$watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false
EnableRaisingEvents = $true
}
$changeAction = [scriptblock]::Create('
# This is the code which will be executed every time a file change is detected
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file $name was $changeType at $timeStamp"
')
Register-ObjectEvent $Watcher -EventName "Changed" -Action $changeAction
}
Register-Watcher "c:\temp"
运行此代码后,更改“C:\temp”目录(或您指定的任何其他目录)中的任何文件。您将看到触发代码执行的事件。
此外,您可以注册的有效 FileSystemWatcher 事件是“已更改”、“已创建”、“已删除”和“重命名”。