Powershell - 监控文件夹内容

时间:2016-02-10 10:14:41

标签: powershell directory monitoring powershell-v3.0

我希望能够在很短的时间内监控文件夹中的更改,届时将会创建大量文件并进行其他更改。

以下代码正在运行,但并未捕获所有更改。

$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

2 个答案:

答案 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,希望这有帮助。