sugram
Goto Top

Mehrere Dateien auf Veränderung überprüfen (Batch - VBS Script)

Hallo

Mein Ziel ist es in einem Ordner mehrere Dateien zu überprüfen, ob diese geändert wurden.
Aktuell habe ich dazu ein Batch und ein vbs Script.
Die Teillösungen habe ich über google auch hier gefunden, nur klappt das Zusammenspiel noch nicht.

Batch Code:

dir /b c:\tmp\TK\*.cfg >> C:\temp\Cam.txt

for /f  %%i in (C:\temp\Cam.txt) do cscript u:\batch\CFG.vbs c:\tmp\tk\%%i

VBS Code:

'CheckUpdated.vbs  
'Defaultwerte:  
param = WScript.arguments.item(0)
sFile = "& param"  
'sFile = "C:\tmp\TK\Test.cfg"  
'lInterv = 30000 '30 s  
lInterv = 3000'30 s  

If WScript.Arguments.Count > 0 Then sFile = WScript.Arguments(0)
If WScript.Arguments.Count > 1 Then lInterv = WScript.Arguments(1)
'MsgBox "Ueberwachung von " & sFile & vbCrLF & "gestartet, Intervall: " & lInterv / 1000 & " Sekunden"  
Set fso = CreateObject("Scripting.FileSystemObject")  
bRun = True
sTimeStamp = fso.GetFile(sFile).DateLastModified
Do While bRun
	Do While fso.GetFile(sFile).DateLastModified = sTimeStamp
		WScript.Sleep lInterv
	Loop
	sTimeStamp = fso.GetFile(sFile).DateLastModified
	iRet = MsgBox("Datei " & sFile & " wurde geaendert." , 65, sTimeStamp)  
	If iRet = vbCancel Then bRun = False
Loop
Msgbox "Ueberwachung von " & sFile & " beendet."  

Mit einem einzelnen File klappt das VBS Script einwandfrei.
Nur wenn ich dann über die Batch die Datei auslese und dem Script übergebe, macht er nur ein File und nicht weiter.
Leider habe ich da jetzt zu wenig Ahnung woran das liegt und hoffe das mir hierbei jemand helfen könnte.

Vielen Dank schon mal im voraus.

Content-Key: 648127

Url: https://administrator.de/contentid/648127

Printed on: April 27, 2024 at 10:04 o'clock

Member: rubberman
Solution rubberman Feb 06, 2021 at 14:16:57 (UTC)
Goto Top
Kann nicht funktionieren, denn sobald du das VBScript mit dem ersten Dateinamen aufrufst, wird darauf gewartet, dass cscript.exe endet, bevor mit dem nächsten Dateiname weitergemacht wird. Passiert natürlich nicht.
Probier mal mit FileSystemWatcher in PowerShell. Etwa so:
Add-Type -AssemblyName PresentationFramework
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\tmp\TK"  
$watcher.Filter = "*.cfg"  
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$null = Register-ObjectEvent $watcher "Changed" -Action { [System.Windows.MessageBox]::Show($Event.SourceEventArgs.FullPath, "Geänderte Datei", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information) }  
while ($true) {sleep 5}
Steffen
Member: sugram
sugram Feb 08, 2021 updated at 05:41:07 (UTC)
Goto Top
Vielen Dank.

Ja, die gute Powershell ... ich müßte mich damit wirklich mal beschäftigen.
Funktioniert so ganz gut, bis auf das bei einer Änderung 2 mal das Hinweisfenster erscheint, aber daß ist jetzt nicht das Problem.
Bzw. wenn ich es per cmd aufrufe kommt es mehrmals face-wink


Danke nochmals!
Member: rubberman
Solution rubberman Feb 08, 2021 at 17:02:56 (UTC)
Goto Top
Hmm, ja das ist ein bekanntes Problem. Ich habe aber auch noch ein bisschen Vintage Code in meiner Sammlung herumliegen.

VBScript:
Option Explicit

Const Path = "C:\tmp\TK"  
Const Extension = "cfg"  
Const Interval = 5

Dim oWSH, oFSO, oWMI, oEvent, colEvents
Dim sPath, sDrive, sFolder

Set oWSH = CreateObject("WScript.Shell")  
Set oFSO = CreateObject("Scripting.FileSystemObject")  
oWSH.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName)
sPath = oWSH.ExpandEnvironmentStrings(Path)
sPath = oFSO.GetAbsolutePathName(sPath)
If Not oFSO.FolderExists(sPath) Then
  MsgBox "Verzeichnis existiert nicht."  
  WScript.Quit
End If
sDrive = oFSO.GetDriveName(sPath)
sFolder = Replace(Mid(sPath, 3) & "\", "\", "\\", 1, -1, vbTextCompare)  

Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
Set colEvents = oWMI.ExecNotificationQuery( _
  "SELECT * FROM __InstanceModificationEvent" _  
  & " WITHIN " & CStr(Interval) _  
  & " WHERE Targetinstance ISA 'CIM_DataFile'" _  
  & " AND TargetInstance.Drive='" & sDrive & "'" _  
  & " AND TargetInstance.Path='" & sFolder & "'")  

Do
  Set oEvent = colEvents.NextEvent()
  If StrComp(oEvent.TargetInstance.Extension , Extension, vbTextCompare) = 0 Then MsgBox "Geänderte Datei" & vbNewLine & oEvent.TargetInstance.Name  
Loop

Steffen
Member: sugram
sugram Feb 09, 2021 at 06:34:11 (UTC)
Goto Top
Vielen Dank für deine Hilfe und den Code aus deiner Sammlung face-smile