2016-02-10 96 views
3

我希望能夠在很短的時間內監控文件夾中的更改,這時會創建大量文件並進行其他更改。Powershell - 監控文件夾內容

下面的代碼正在工作,但沒有收到所有更改。

$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次。或者相反。

請參閱的

  • 輸出生成我的文件夾
  • 名爲HiThere
  • 然後重命名創建一個新的文件夾中hello.txt下面hello.txtsomeTxt.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

注意,FileSystemWatcher的是非常不可靠,通常建議使用監視文件系統不同的方法。 –

+0

@GeraldSchneider嗨,謝謝你的回放。我看到,不知道,但也許有人有一個想法來改進代碼。我主要是玩弄PowerShell,並試圖找到新的酷酷的方式來使用它。在這個小小的項目上大肆渲染,並且認爲它會發揮作用。如果沒有解決方案,我會放過它,但還沒有:) – CM2K

回答

1

insted的,而在($ true)循環的,你嘗試過 「註冊-ObjectEvent」?

我剛剛使用此方法測試了我的一個腳本,並且可以輕鬆地獲取2000個空文件(在powershell中生成)。不幸的是,這是在本地機器上。

說明:定義函數,如正常和離開你去。 您使用的命令是:

Start-BackupScript -WatchFolder "C:\temp\my watch folder\" -DestinationFolder "C:\temp\backup\" 

腳本現在監控「C:\ TEMP \我的收藏夾\」在特定文件夾中創建新的文件將其移動到「C:\ TEMP \備份\ 」。它還會將日期和時間附加到文件中。

假設您已經開始使用上述參數的腳本。您現在將「hello_world.txt」放置在監視文件夾中。該腳本將文件移動到「C:\ temp \ backup \」,新文件名爲:「hello_world_2016-02-10_10-00-00.txt」

該腳本在後臺運行。如果你想知道它是怎麼做的,然後使用命令:

Get-Job $backupscript -Keep 

在那裏,你可以看到它一直在做的時候。請注意,-Keep參數將輸出保存在「日誌」中,以便日後檢查。

腳本:

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" 
    } 
} 
+0

我沒有之前,但自從你提到它,我現在:)我不知道如何使用它(我就像你說的那樣簡單地替換它)。我得到這個消息'爲以下參數提供值:eventName:'我應該通過那裏?從快速閱讀中,我發現我可以通過使用「-MessageData參數」在do塊中傳遞一個變量。雖然不能完全解決它。你是怎麼做到的? – CM2K

+0

我剛剛將我的腳本添加到帖子中。請注意,$ action是每創建一個文件時都執行的腳本塊。 –

+0

謝謝。你能寫一個簡單的'如何使用'指令/附加到它嗎?對於我和未來的讀者 – CM2K

0

你看註冊,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,希望這有助於。