我希望能够在很短的时间内监控文件夹中的更改,届时将会创建大量文件并进行其他更改。
以下代码正在运行,但并未捕获所有更改。
$folder = ’C:\Data’
$timeout = 1000
$FileSystemWatcher = New-Object System.IO.FileSystemWatcher $folder
Write-Host ”Press CTRL+C to abort monitoring $folder”
while ($true) {
$result = $FileSystemWatcher.WaitForChanged(‘all’, $timeout)
if ($result.TimedOut -eq $false)
{
Write-Warning (‘File {0} : {1}’ -f $result.ChangeType, $result.name)
}
}
Write-Host ’Monitoring aborted.’
如果我在C:\Data
上使用此功能,则可以但:
我创建一个.txt,它说2次new text document.txt
。
然后我填写新txt的名称,它输出3次。或者相反。
请参阅下面的
输出hello.txt
HiThere
和hello.txt
重命名为someTxt.txt
输出:
`Press CTRL+C to abort monitoring C:\Data
WARNING: File Created : New Text Document.txt
WARNING: File Changed : New Text Document.txt
WARNING: File Changed : New Text Document.txt
WARNING: File Changed : hello.txt
WARNING: File Created : New folder
WARNING: File Renamed : HiThere
WARNING: File Renamed : someTxt.txt
WARNING: File Changed : someTxt.txt
WARNING: File Changed : someTxt.txt
WARNING: File Changed : someTxt.txt
WARNING: File Deleted : someTxt.txt
WARNING: File Deleted : HiThere`
更多问题:如果我在newtwork驱动器上使用它,那么并非所有更改都被捕获。 (这将是此脚本的重点,用于监视映射驱动器中的文件夹)。
仅通过更改文件夹路径来测试计算机上的代码。
使用Powershell ISE 3.0
答案 0 :(得分:2)
insted of while($ true)循环,你试过" Register-ObjectEvent"?
我刚刚使用此方法测试了我的一个脚本,并且可以轻松获取2000个空文件(在PowerShell中生成)。不幸的是,这是在本地机器上。
说明:定义正常的功能,然后离开。 您使用的命令是:
Start-BackupScript -WatchFolder "C:\temp\my watch folder\" -DestinationFolder "C:\temp\backup\"
脚本现在监视" C:\ temp \ my watch folder \"对于在该特定文件夹中创建的新文件,将它们移动到" C:\ temp \ backup \"。它还会将日期和时间附加到文件中。
假设您已使用上述参数启动了脚本。你现在放置" hello_world.txt"在监视文件夹中。该脚本将文件移动到" C:\ temp \ backup \"使用新文件名:" hello_world_2016-02-10_10-00-00.txt"
脚本在后台运行。如果您想知道它是如何做的,那么使用命令:
Get-Job $backupscript -Keep
在那里你可以看到它在做什么。请注意,-Keep参数将输出保存在" log"中,以便稍后查看。
脚本:
function Start-BackupScript
{
[CmdletBinding()]
Param
(
[Parameter()]
[String]$WatchFolder,
[Parameter()]
[String]$DestinationFolder
)
Process
{
$filter = '*.*'
$fsw = New-Object IO.FileSystemWatcher $WatchFolder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
$action = {
$fileMissing = $false
$FileInUseMessage = $false
$copied = $false
$file = Get-Item $Args.FullPath
$dateString = Get-Date -format "_yyyy-MM-dd_HH-mm-ss"
$DestinationFolder = $event.MessageData
$DestinationFileName = $file.basename + $dateString + $file.extension
$resultfilename = Join-Path $DestinationFolder $DestinationFileName
Write-Output ""
while(!$copied) {
try {
Move-Item -Path $file.FullName -Destination $resultfilename -ErrorAction Stop
$copied = $true
}
catch [System.IO.IOException] {
if(!$FileInUseMessage) {
Write-Output "$(Get-Date -Format "yyyy-MM-dd @ HH:mm:ss") - $file in use. Waiting to move file"
$FileInUseMessage = $true
}
Start-Sleep -s 1
}
catch [System.Management.Automation.ItemNotFoundException] {
$fileMissing = $true
$copied = $true
}
}
if($fileMissing) {
Write-Output "$(Get-Date -Format "yyyy-MM-dd @ HH:mm:ss") - $file not found!"
} else {
Write-Output "$(Get-Date -Format "yyyy-MM-dd @ HH:mm:ss") - Moved $file to backup! `n`tFilename: `"$resultfilename`""
}
}
$backupscript = Register-ObjectEvent -InputObject $fsw -EventName "Created" -Action $action -MessageData $DestinationFolder
Write-Host "Started. WatchFolder: `"$($WatchFolder)`" DestinationFolder: `"$($DestinationFolder)`". Job is in: `$backupscript"
}
}
答案 1 :(得分:0)
你看过Register-WMIEvent吗?
这样的事情:
Register-WmiEvent -Query "SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'CIM_DataFile' and TargetInstance.Path = '\\Users\\Administrator\\' and targetInstance.Drive = 'C:' and (targetInstance.Extension = 'txt' or targetInstance.Extension = 'doc' or targetInstance.Extension = 'rtf') and targetInstance.LastAccessed > '$($cur)' " -sourceIdentifier "Accessor" -Action $action `
您可以监控文件夹,然后监控文件夹中的特定扩展名。然后设置PowerShell脚本块来处理任何访问。如果您有兴趣,可以在此处进行更多操作:https://blog.varonis.com/practical-powershell-for-it-security-part-i-file-event-monitoring/
同意上面的一些评论文件监控不可靠 - 滞后和打嗝。 Anywyay,希望这有帮助。