如何使用Powershell文件监视器检测文件夹内的文件夹更改(特别是重命名)



我使用powershell来检测和记录文件夹内的文件夹更改(创建,重命名,删除等)。这个父文件夹接收来自另一个位置的子文件夹,格式为TEMP_XYZ. 将此文件夹复制到父文件夹后,进程自动将其重命名为XYZ(删除后缀TEMP_)

此更改(重命名)必须被检测并记录在日志文件

\testfolderwatchXYZ was Renamed at 7/28/2021 2:03:00 PM
Folder TEMP_XYZ was renamed to XYZ

然而,我不能实现这一点,因为下面的代码只适用于文件。(txt,bmp, zip等)

任何帮助都是感激的。

代码:

# specify the path to the folder you want to monitor:
$Monitorpath ="\testfolderwatch"
$Path = $Monitorpath
# specify which files you want to monitor
$FileFilter = '*'  
# specify whether you want to monitor subfolders as well:
$IncludeSubfolders = $true
# specify the file or folder properties you want to monitor:
$AttributeFilter = [IO.NotifyFilters]::FileName, [IO.NotifyFilters]::LastWrite 
try
{
$watcher = New-Object -TypeName System.IO.FileSystemWatcher -Property @{
Path = $Path
#Filter = $FileFilter
IncludeSubdirectories = $IncludeSubfolders
NotifyFilter = $AttributeFilter
}
$action = {
# change type information:
$details = $event.SourceEventArgs
$Name = $details.Name
$FullPath = $details.FullPath
$OldFullPath = $details.OldFullPath
$OldName = $details.OldName
$ChangeType = $details.ChangeType
$Timestamp = $event.TimeGenerated
$LogDate = Get-Date -format "dd-MMMM-yy"

# save information to a global variable for testing purposes
# so you can examine it later
# MAKE SURE YOU REMOVE THIS IN PRODUCTION!**************************DO NOT USE FOR PROD**************************
$global:all = $details

$text = "{0} was {1} at {2}" -f $FullPath, $ChangeType, $Timestamp
Write-Host ""
Write-Host $text -ForegroundColor DarkYellow
Add-content "\testfolder_watch_logswatchlog_$LogDate.txt" -value $text
switch ($ChangeType)
{
'Changed'  { "CHANGE" }
'Created'  { "CREATED"}
'Deleted'  { "DELETED"
Write-Host "Deletion Handler Start" -ForegroundColor Gray
Start-Sleep -Seconds 4  
Write-Host "Deletion Handler End" -ForegroundColor Gray

}
'Renamed'  { 
# this executes only when a file was renamed
$text = "Folder {0} was renamed to {1}" -f $OldName, $Name
Write-Host $text -ForegroundColor Yellow
Add-content "testfolder_watch_logswatchlog_$LogDate.txt" -value $text
}

# any unhandled change types surface here:
default   { Write-Host $_ -ForegroundColor Red -BackgroundColor White ;
Add-content "testfolder_watch_logswatchlog_$LogDate.txt" -value $_ }
}
}
$handlers = . {
Register-ObjectEvent -InputObject $watcher -EventName Changed  -Action $action 
Register-ObjectEvent -InputObject $watcher -EventName Created  -Action $action 
Register-ObjectEvent -InputObject $watcher -EventName Deleted  -Action $action 
Register-ObjectEvent -InputObject $watcher -EventName Renamed  -Action $action 
}
# monitoring starts now:
$watcher.EnableRaisingEvents = $true
$LogDate = Get-Date -format "dd-MMMM-yy"
Write-Host "Watching for changes to $Path"
Add-content "testfolder_watch_logswatcherstatus.txt" -value "Watching for changes to $Path"
# since the FileSystemWatcher is no longer blocking PowerShell
# we need a way to pause PowerShell while being responsive to
# incoming events. Use an endless loop to keep PowerShell busy:
do
{
Wait-Event -Timeout 1
# write a dot to indicate we are still monitoring:
#Write-Host "." -NoNewline

} while ($true)
}
finally
{
# stop monitoring
$watcher.EnableRaisingEvents = $false

# remove the event handlers
$handlers | ForEach-Object {
Unregister-Event -SourceIdentifier $_.Name
}

$handlers | Remove-Job

# properly dispose the FileSystemWatcher:
$watcher.Dispose()
$LogDate = Get-Date -format "dd-MMMM-yy"
Write-Warning "Event Handler disabled, monitoring ends."
Add-content "testfolder_watch_logswatcherstatus.txt" -value "Event Handler disabled, monitoring ends."
}

//Jagbir

调整您的监视器的NotifyFilter,以便它正在查看目录名称

$AttributeFilter = [IO.NotifyFilters]::FileName, [IO.NotifyFilters]::LastWrite, [IO.NotifyFilters]::DirectoryName  

或者如果您只对目录名的更改感兴趣,则只指定

$AttributeFilter = [IO.NotifyFilters]::DirectoryName  

如果您只对重命名事件感兴趣,则不注册其他事件

$handlers = . {
# Remove Changed, Created, and Deleted if they are of no concern    
# Register-ObjectEvent -InputObject $watcher -EventName Changed  -Action $action 
# Register-ObjectEvent -InputObject $watcher -EventName Created  -Action $action 
# Register-ObjectEvent -InputObject $watcher -EventName Deleted  -Action $action 
Register-ObjectEvent -InputObject $watcher -EventName Renamed  -Action $action 
}

相关内容

  • 没有找到相关文章