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-ID: 648127

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

Ausgedruckt am: 17.11.2024 um 19:11 Uhr

rubberman
Lösung rubberman 06.02.2021 um 15:16:57 Uhr
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
sugram
sugram 08.02.2021 aktualisiert um 06:41:07 Uhr
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!
rubberman
Lösung rubberman 08.02.2021 um 18:02:56 Uhr
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
sugram
sugram 09.02.2021 um 07:34:11 Uhr
Goto Top
Vielen Dank für deine Hilfe und den Code aus deiner Sammlung face-smile