Bir klasör oluşturulur ve bir dosya oluşturulurken veya düzenlenirken komut satırı eylemi nasıl başlatılır?


82

Vista makinemde bir tür komut dosyası kurmam gerekiyor, böylece bir dosya belirli bir klasöre eklendiğinde, dosya üzerinde çalışan bir arka plan işlemini otomatik olarak tetikler. (Arka plan işlemi, dosya adını önceden belirlenmiş bazı diğer seçeneklerle birlikte argüman olarak alan bir komut satırı yardımcı programıdır.)

Bunu, performans ve bakım nedenleriyle mümkünse yerel Windows özelliklerini kullanarak yapmak istiyorum. Görev Zamanlayıcı'yı kullanmaya çalıştım, ancak tetikleme sistemini bir süre kullandıktan sonra, fazla bir anlam ifade edemedim ve ihtiyacım olanı yapıp yapamayacağından bile emin değilim.

Herhangi bir öneriniz için teşekkür ederiz. Teşekkürler!


Linux inotify gibi bir şey, ama pencereler için ihtiyacınız var gibi geliyor. Jnotify yardımcı olabilir, ancak Java olduğundan çok ağır olabilir.
Keith

1
Bunu da merak ediyordum ... [MSDN sayfasını] buldum ( msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx) .
Keith

2
Yukarıdaki bağlantı aspx'den
Paz

Yanıtlar:


92

İşte biz klasörleri izlemek için Powershell kullanıyoruz.
Windows Vista'dan (.NET ve PowerShell önceden yüklenmiş) herhangi bir ek araç kullanmadan kullanılabilir.

Bu komut dosyası belirli bir klasörü izler ve bir günlük dosyası yazar. İşlemi değiştirebilir ve ne istersen yapabilirsin, örneğin harici bir araç ara

Örnek günlük dosyası

23.07.2014 19:22:04, Oluşturuldu, D: \ kaynak \ Yeni Metin Document.txt
23.03.2014 19:22:09, Değişti, D: \ kaynak \ Yeni Metin Document.txt
23.03.2014 19:22:09, Değişti, D: \ kaynak \ Yeni Metin Document.txt
23.03.2014 19:22:14, Silindi, D: \ kaynak \ Yeni Metin Document.txt

StartMonitoring.ps1

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "D:\source"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\log.txt" -value $logline
              }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    Register-ObjectEvent $watcher "Changed" -Action $action
    Register-ObjectEvent $watcher "Deleted" -Action $action
    Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 5}

Nasıl kullanılır

  1. Yeni bir metin dosyası oluştur
  2. Yukarıdaki kodu kopyala ve yapıştır
  3. Aşağıdaki ayarları kendi ihtiyaçlarınıza göre değiştirin:
    • izlenecek klasör: $watcher.Path = "D:\source"
    • sadece belirli dosya tiplerini içerecek dosya filtresi: $watcher.Filter = "*.*"
    • alt dizinleri dahil et evet / hayır: $watcher.IncludeSubdirectories = $true
  4. Kaydet ve yeniden adlandır StartMonitoring.ps1
  5. Sağ tıklatarak izlemeye başlayın »PowerShell ile Çalıştır

İzlemeyi durdurmak için, PowerShell pencerenizi kapatmanız yeterli

daha fazla okuma


Güzel çalışıyor ama stop betiğinin işlevi nedir? Hatalar alıyorum: "Unregister-Event: 'SourceIdentifier' parametresine argüman bağlanamıyor çünkü boş." pastebin.com/ugLB3a69
Jan Stanstrup

@JanStanstrup Muhtemelen daha fazla insanı ikinci senaryo ile karıştırdım. Onu sileceğim. StartWatching.ps1İzlemeyi durdurmak için pencerenizi kapatmanız yeterlidir . Eğer ilk senaryoya dahil ederseniz ikinci komut sadece değişkenleri kaydetmek için çalışır $created, $changed, $deletedveya$renamed
nixda

Cevap için teşekkürler. Herkes değiştirilirken
github'a

5

Doğru satırlarda görünüyorsunuz - düzenli olarak bir .bat veya .cmd dosyasını çalıştırmak için görev zamanlayıcıyı kullanabilirsiniz ve bu dosya gerekli dosyanın varlığını kontrol etmek için bir satırla başlayabilir - aslında, ben dosyanın var olup olmadığını kontrol eder; Örneğin:

@ECHO OFF
REM Example file
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS EXIT 1
REM All this gets done if the file exists...
:
:
EXIT 0

Ayrıca bu kodu değiştirebilir ve döngüde 1 dakikalık bir gecikmeyle bir döngüde çalıştırmasını ve ardından Windows başlangıç ​​klasöründeki toplu iş dosyasına bir başvuru koymasını sağlayabilirsiniz:

@ECHO OFF
REM Example file
:LOOP    
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS GOTO SKIP01
REM All this gets done if the file exists...
:
:
:SKIP01
REM Crafty 1 minute delay...
PING 1.1.1.1 -n 10 -w 6000 >NUL
GOTO LOOP

Çalışan Windows sürümüne ve hangi ek kaynak kitlerinin kurulu olduğuna göre bir gecikme elde etmenin başka yolları vardır, ancak PING komutu her koşulda hemen hemen işe yarar. Yukarıdaki PING komutunda, 10 fantom PING, aralarında 6000ms'lik (yani: 6 saniye) bir gecikme ile yürütülür, toplu iş dosya döngüleri arasında ihtiyacınız olan gecikmeyi elde etmek için bu değerlerle oynayabilirsiniz.


güzel fikir .. btw, C: \> ping 1.1.1.1 -n 10 -w 6000 nedense bilgisayarımda 1 dakika 10 saniye sürdü. ancak -n 1 -w 60000 tam olarak 1 dakika sürdü.
barlop

@barlop - on saniye tutarsızlık, -n 10vs kaynaklanmaktadır -n 1.

@Randolph Potter 10 lot 6 saniyede, 60 saniyede değil mi? ve kullandığınız 10'da 10 kez anlamına gelmelidir.
barlop

Muhtemelen haklısın. Onu geri alıyorum ve sarı saçlarımı suçluyorum.

Bir izleme grubu için bu döngüyü kullandım IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo. Hackish, ama işe yarıyor. Fikir için teşekkürler.
Snekse 01.01.2012

3

Önerileriniz için teşekkürler.

Aşağı yukarı Linker3000'in klasörü sorgulama fikrine dayanan bir VBScript yazarak ve Başlangıçta çalışması için Görev Zamanlayıcı'yı kullandım. Bu kaynaktan temel sözdizimini elde ettim ve gerekli ayarları yaptım.

Senaryoyu bürünmüş olayı olay odaklı bir sistemde çalıştırmak için hala bir noktada optimize etmek isterdim, ama üzerinde çalışacak zamanım kalmadı ve bu da yeterince iyi.

İşte senaryo, herkesin ilgilenmesi durumunda (ilgisiz dönüşüm segmentinin netliği için yeniden düzenlenmiş olarak):

' FOLDER TO MONITOR
strFolder = "J:\monitored-folder"

' FREQUENCY TO CHECK IT, IN SECONDS
nFrequency = 10

strComputer = "."
strQueryFolder = Replace(strFolder, "\", "\\\\")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" &     strComputer & "\root\cimv2") 
Set colMonitoredEvents = objWMIService.ExecNotificationQuery ("SELECT * FROM __InstanceCreationEvent WITHIN " & nFrequency & " WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent='Win32_Directory.Name=""" & strQueryFolder & """'") 

Do 
    Set objLatestEvent = colMonitoredEvents.NextEvent
    strNewFile = objLatestEvent.TargetInstance.PartComponent
    arrNewFile = Split(strNewFile, "=")
    strFilePath = arrNewFile(1)
    strFilePath = Replace(strFilePath, "\\", "\")
    strFilePath = Replace(strFilePath, Chr(34), "")
    strFileName = Replace(strFilePath, strFolder, "")
    strTempFilePath = WScript.CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) & "\TEMP.M4A"

    ' DO THE OPERATION STUFF
    ' ...
Loop

(Ayrıca, bu soruyu resmen cevapsız bırakmak istemiyorum - ve soruya kendi cevabımı kabul etmekten nefret ediyorum - ama Linker3000'in cevabını teşekkür olarak kabul ettim!)


2

Sen de görünebilir Dropit (ücretsiz). Program, gelen dosyaları bazı otomatik yollarla işlemek için uygundur. Görüntüleri dönüştürmek, PDF'leri bölmek vb. İçin parametreleri diğer komut satırı programlarına taşıyabilir, kopyalayabilir, silebilir ve iletebilirsiniz.


2

Eylem yalnızca değiştirilen dosyaları kopyalamaksa, robocopy / MON kullanabilirsiniz.

Robocopy FileSystemWatcher'ı kullanıyor mu, yoksa değişiklikler için oylama yaparak mı çalışıyor?


1

Veya Watch 4 Folder'ı kullanabilirsiniz . Görünüşe göre, taşınabilir, taşınabilir ve Windows 7 ile uyumludur. Denemedim, ancak bir web araması yoluyla buldum ve ileteceğimi düşündüm.

Ben de sitede VBS komut dosyası sevdim.


Ne yazık ki, yalnızca ücretli sürüm taşınabilirdir
nixda

Bu yazılımı kullanmayı düşünüyordum. Bir ağ paylaşımını birçok kullanıcıdan gelen önemli dosyalarla izlemek için buna güvenir misiniz?
Paul Matthews,

Watch4Folder ücretsiz sürümü yapılandırılabilir sadece bir "örnek" girişi vardır.
PeterCo


0

Bunu yapmak için http://www.myassays.com/folder-poll adresindeki ticari anketi (yani ücretsiz değil) Folder Poll kullanıyoruz . Kolay yapılandırmaya izin vermek için kullanıcı dostu bir yönetici uygulaması içeren bir Windows uygulamasıdır. Ayrıca, bir XML yapılandırma seçeneği var. Gerçek klasör yoklama, bir Windows hizmeti olarak çalışır (bu nedenle her yeniden başlatmada otomatik olarak başlar). Yoklamalı bir klasörde yeni bir dosya algılandığında, uygulama otomatik olarak başlatılabilir (kendi özel komut satırı argümanlarınızı belirleyebilirsiniz). Dosyaları kopyala / taşı gibi diğer işlemleri de yapabilir. Ayrıca, etkinlik bir günlük dosyasına kaydedilebilir ve başka gelişmiş işlemler de vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.