Aktionen

Zabbix:Template Windows Dateien und Ordner

Aus znilwiki

Ich nutze Zabbix immer mehr zur Überwachung diverser Dinge - und brauchte mal eben etwas um die Anzahl von Dateien in einem Ordner zu prüfen und um das Alter einer Datei fest zu stellen (hab hier so einen Listenaufbereiter mit automatischen Datenbankexport).

Das Tool lässt sich aber auch als ganz normales Kommandozeilentool verwenden - auf Grund der Ziel-Verwendung mit Zabbix ist die Ausgabe halt minimalistisch.

Ich erkläre hier zunächst das Programm - und dann wie man es in Zabbix einbindet.


Download: Zabbix-FileAndFolder.zip


1 Changelog

  • 12.04.2013: Erste Version, Version der .exe ist 1.0.6.10
  • 22.04.2015: Neue Version 2.0.0.39
    • Neu: DirGetSize
    • Neu: FileCountSize
    • Neu: FileCountAge
    • Neu: FileGetSize
    • Neu: FileGetVersion
    • Neu: GetAttrib
    • Neu: Verbose Modus
  • 12.05.2017: Neuer Version 3.0.0.5
    • Neu: Bei den Parametern FileCountSize und FileCountAge kann man nun als 3. Parameter eine Suchmaske für Dateien angeben




2 Screenshots

Zabbix FilderAndFolder-001.png

Und hier die Items dazu:
Zabbix FilderAndFolder-002.png



3 Aufruf

ZabbixItem-fileandfolder.exe <Option> <Datei oder Ordner>

die möglichen Parameter sind:

fileandfolder.exe <Option> <Datei oder Ordner> [Suchmaske] [--Verbose]
 
DirGetSize        : gibt die Verzeichnisgröße in Bytes zurück
                    ist inklusive aller Unterordner und deren Dateien
                    -1 = Verzeichnis nicht gefunden

FileCreateAge     : Liefert die Anzahl der vergangenen Sekunden seit der,
                    Erstellung einer Datei zurück.
                    -1 = Datei nicht gefunden

FileCount         : Zählt die Anzahl von Dateien in einem Ordner
                    und gibt die Anzahl zurück, 0 = keine Dateien gefunden
                    Unterverzeichnisse werden mitgezählt!
                    Es muss ein Verzeichnis angegeben werden!

FileCountR        : Wie zuvor, jedoch Rekursiv, Ordner werden mitgezählt

FileCountR2       : Wie zuvor, Rekursiv, Ordner werden nicht mitgezählt

FileFindCount     : Gibt die Anzahl der gefundenen Dateien / Ordner zurück auf
                    die das Suchmuster zutrifft. Beispiele:
                    C:\Daten\*.docx  = Alle Dateien die auf .docx enden
                    C:\Daten\Test*.* = Alle Dateien die mit Test beginnen
                    Es gelten die üblichen Suchmuster mit * und ?
                    Dateien in Unterordnern werden nicht gefunden, es wird
                    der gewählte Ordner durchsucht.

FileCountSize=x   : Zählt die Anzahl von Dateien in einem Ordner die größer
                    als die mit x angegebene Größe sind und gibt die Anzahl zurück
                    0 = keine Dateien gefunden, Ordner werden ignoriert, keine
                    rekursion, Angabe der Größe in Bytes

#FileCountSize=x  : Wie zuvor, jedoch 'kleiner als' statt größer


FileCountAge=x    : Zählt die Anzahl von Dateien in einem Ordner die älter
                    als das mit x angegebene Alter sind und gibt die Anzahl zurück
                    0 = keine Dateien gefunden, Ordner werden ignoriert, keine
                    Rekursion, Angabe der Zeit in Sekunden
                    Basis ist das Erstellungsdatum

#FileCountAge=x   : Wie zuvor, nur 'jünger sind' statt älter

FileModifyAge     : Liefert die Anzahl der vergangenen Sekunden seit der
                    letzten Änderung einer Datei zurück
                    -1 = Datei nicht gefunden

FileGetSize       : gibt die Dateigröße in Bytes zurück
                    -1 = Datei nicht gefunden

FileGetVersion    : gibt die Dateiversion als Typ Char zurück
                    -1 = Datei nicht gefunden

GetAttrib         : gibt die Datei- oder Verzeichnisattribute als Typ Char zurück
                    -1 = Datei/Verzeichnis nicht gefunden
                    Rückgabewert ist eine Kombination von "RASHNDOCTIPL":
                     "R" = Read-Only
                     "A" = Archive
                     "S" = System
                     "H" = Hidden
                     "N" = Normal
                     "D" = Directory
                     "O" = Offline
                     "C" = Compressed (NTFS compression, not ZIP compression)
                     "T" = Temporay
                     "I" = Not content-indexed
                     "P" = Sparse File
                     "L" = Symbolic Link / Junction
[Suchmaske]       : Schränkt bei Verzeichnisbefehlen auf Dateien entsprechend
                    dieser Maske ein, z.B. *.txt - Funktioniert mit:
                    FileCountSize, FileCountAge

--Verbose         : Verbose Modus mit Anzeige der Prüfungen etc

Allgemein gilt das im Fehlerfall (wenn z.B. ein ungültiger Parameter) immer -1 zurück gegeben wird (z.B. bei /FileCount wurde eine Datei statt Ordner angeben)

Important.png
Hinweis: Testet vorher in einer DOS-Box ob das Ergebnis kommt welches Ihr erwartet! Der --Verbose Modus gibt z.B. bei den größer/kleiner Vergleichen detaliert aus wie er prüft




3.1 Beispiele 1: Dateien zählen

In der oberen Zeile steht immer der Aufruf, in der Zeile darunter steht ein Beispiel-Rückgabewert

Alle Dateien und Ordner im Ordner C:\Windows zählen

ZabbixItem-fileandfolder.exe /FileCount C:\Windows
102


Alle Dateien und Ordner inklusive Unterordner im Ordner C:\Windows zählen (der Aufruf dauert schon länger)

ZabbixItem-fileandfolder.exe /FileCountR C:\Windows
89189


Alle Dateien inklusive Dateien in Unterordner im Ordner C:\Windows zählen - Ordner/Verzeichnisse selbst werden nicht gezählt.

ZabbixItem-fileandfolder.exe /FileCountR2 C:\Windows
72557


Alle *.exe im Verzeichnis C:\Windows\System32 finden (ohne Unterordner)

ZabbixItem-fileandfolder.exe /FileFindCount C:\Windows\System32\*.exe
296


Alle *.exe im Verzeichnis C:\Windows\System32 finden die mit dem Buchstaben N beginnen (ohne Unterordner)

ZabbixItem-fileandfolder.exe /FileFindCount C:\Windows\System32\N*.exe
15


Alle Dateien im Verzeichnis C:\Windows\System32 finden welche die Zeichenfolge inst enthalten (ohne Unterordner)

ZabbixItem-fileandfolder.exe /FileFindCount C:\Windows\System32\*inst*
17




3.2 Beispiele 2: Dateialter / Änderungen

Der Wert der zurück gegeben wird entspricht der Differenz vom Zeitpunkt der Erstellung oder Änderung einer Datei bis zum Zeitpunkt des Aufrufes von ZabbixItem-fileandfolder.exe.
Frage ich das Erstellungsdatum einer Datei ab die ich vor 10 Minuten neu erstellt habe, wird 600 zurück gegeben.
Je nach Alter können es sehr hohe Werte werden, so ein jahr hat 31.536.000 Sekunden

Zeit seit der Erstellung der C:\Windows\explorer.exe in Sekunden:

ZabbixItem-fileandfolder.exe /FileCreateAge C:\Windows\explorer.exe
75210302


Zeit seit der letzten Änderung der C:\Windows\Temp\chrome_installer.log in Sekunden:

ZabbixItem-fileandfolder.exe /FileModifyAge C:\Windows\Temp\chrome_installer.log
2967822




3.3 Beispiele 3: Dateigröße

Der Rückgabewert ist in Bytes.

Größe der Datei C:\Windows\Temp\chrome_installer.log in Bytes

ZabbixItem-fileandfolder.exe /FileGetSize C:\Windows\Temp\chrome_installer.log
920

Größe der Datei C:\Windows\explorer.exe in Bytes

ZabbixItem-fileandfolder.exe /FileGetSize C:\Windows\explorer.exe
2872320




3.4 Beispiele 4: Dateien in Verzeichnissen zählen nach Größe oder Alter

Der Rückgabewert ist die Anzahl der Dateien.

Anzahl der Dateien im Verzeichnis C:\_AutoIt\ZabbixAgent\FilesAndFolder\ die älter als 1 Tag sind (=86400 Sekunden)

fileandfolder.exe FileCountAge=86400 C:\_AutoIt\ZabbixAgent\FilesAndFolder\
3


Wie zuvor, jedoch jünger statt älter:

fileandfolder.exe #FileCountAge=86400 C:\_AutoIt\ZabbixAgent\FilesAndFolder\
10


Anzahl der Dateien im Verzeichnis C:\_AutoIt\ZabbixAgent\FilesAndFolder\ liegen, die Dateiendung *bak haben und die älter als 1 Tag sind (=86400 Sekunden)

fileandfolder.exe FileCountAge=86400 C:\_AutoIt\ZabbixAgent\FilesAndFolder\ *.bak




4 Einbinden in Zabbix

  • Kopiert die fileandfolder.exe in das Verzeichnis mit eurem Zabbix-Agenten
  • Bearbeitet die zabbix_agentd.win.conf und ergänzt folgende Zeilen
UserParameter=znil.fileandfolder[*],"C:\Program Files\Zabbix\UserParameter\fileandfolder.exe" "$1" "$2" "$3" "$4"
  • Startet den Dienst des Zabbix-Agenten einmal neu!
Den Pfad müsst Ihr natürlich anpassen
  • Importiert in Zabbix das Template znil_Template_Dateien_und_Ordner_BEISPIELE_Vxxxx-xx-xx.xml
  • Schaut euch das Beipieltemplate an!




5 Nutzung der Items

In dem Beispiel-Template sind sowohl Abfragen drin wecleh die von mir programmierte fileandfolder.exe nutzen als auch Abfragen welche die im Zabbix-Agenten integriert sind vfs.file.xxx
Generell gilt der Hinweis:

Important.png
Hinweis: In allen Pfaden den "/" statt dem "\" nutzen!

Die Zabbix-Internen abfragen kommen zwar auch mit dem Backslash "\" aus ... aber bei der Übergaben an die fileandfolder.exe ging das regelmäßig schief - deshalb die Linux-Schreibweise.
Aus dem gleichen Grund muss bei den Dateisuchoptionen ein % statt dem * angebeben werden. Das ? kann ganz normal genutzt werden.



6 Quellcode

Wie fast immer im AutoIt geschrieben:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=2014 von Bernhard Linz / Bernhard@znil.de
#AutoIt3Wrapper_Res_Fileversion=2.0.0.40
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Date.au3>


Dim $h_suchhandle
Dim $i_Zaehler
Dim $s_Path
Dim $s_temp
Dim $a_dateizeit
Dim $a_aktuellezeit
Dim $a_dateiliste
Dim $i_Sekunden
Dim $i_Dateigroesse
Dim $i_DateiSuchGroesse = 0
Dim $i_DateiSuchAlter = 0
Dim $b_Inverse = False
Global $b_Verbose = False

;                   	     10        20        30        40        50        60        70        80
;                 	12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s_Header = _
					"+------------------------------------------------------------------------------" & @CRLF & _
					"| fileandfolder.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _
					"+------------------------------------------------------------------------------" & @CRLF & _
					"| 2013/2015 von Bernhard Linz für http://znil.net - Kontakt: Bernhard@znil.net" & @CRLF & _
					"+------------------------------------------------------------------------------" & @CRLF & _
					@CRLF

;                            10        20        30        40        50        60        70        80
;                 	12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s_HilfeText = _
					"Hilfsprogramm für die Abfrage von Werten rund aus dem Dateisystem." & @CRLF & _
					"Erstellt weil es mir in Zabbix zu kompliziert war / nicht das war was ich wollte." & @CRLF & _
					"genaue Anleitung unter dem Weblink unten am Ende." & @CRLF & _
					"Testet den Aufruf auf jeden Fall manuell bevor in in Zabbix als Item einbaut!" & @CRLF & _
					"Die Rückgabewerte werden gleichzeitig auch als Exit-Codes zurückgegeben - können also" & @CRLF & _
					"auch in Batchdateien mit %ERRORLEVEL% abgefragt werden" &  @CRLF & _
					"-------------------------------------------------------------------------------" & @CRLF & _
					@CRLF & _
					"Aufruf: " & @CRLF & _
					@CRLF & _
					@ScriptName & " <Option> <Datei oder Ordner> [--Verbose]" & @CRLF & _
					@CRLF & _
					"DirGetSize        : gibt die Verzeichnisgröße in Bytes zurück" & @CRLF & _
					"                    ist inklusive aller Unterordner und deren Dateien" & @CRLF & _
					"                     -1 = Verzeichnis nicht gefunden" & @CRLF & _
					@CRLF & _
					"FileCreateAge     : Liefert die Anzahl der vergangenen Sekunden seit der," & @CRLF & _
					"                    Erstellung einer Datei zurück." & @CRLF & _
					"                     -1 = Datei nicht gefunden" & @CRLF & _
					@CRLF & _
					"FileCount         : Zählt die Anzahl von Dateien in einem Ordner" & @CRLF & _
					"                     und gibt die Anzahl zurück, 0 = keine Dateien gefunden" & @CRLF & _
					"                     Unterverzeichnisse werden mitgezählt!" & @CRLF & _
					"                     Es muss ein Verzeichnis angegeben werden!" & @CRLF & _
					@CRLF & _
					"FileCountR        : Wie zuvor, jedoch Rekursiv, Ordner werden mitgezählt" & @CRLF & _
					@CRLF & _
					"FileCountR2       : Wie zuvor, Rekursiv, Ordner werden nicht mitgezählt" & @CRLF & _
					@CRLF & _
					"FileFindCount     : Gibt die Anzahl der gefundenen Dateien / Ordner zurück auf" & @CRLF & _
					"                     die das Suchmuster zutrifft. Beispiele:" & @CRLF & _
					"                     C:\Daten\*.docx  = Alle Dateien die auf .docx enden" & @CRLF & _
					"                     C:\Daten\Test*.* = Alle Dateien die mit Test beginnen" & @CRLF & _
					"                     Es gelten die üblichen Suchmuster mit * und ?" & @CRLF & _
					"                     Dateien in Unterordnern werden nicht gefunden, es wird" & @CRLF & _
					"                     der gewählte Ordner durchsucht." & @CRLF & _
					@CRLF & _
					"FileCountSize=x   : Zählt die Anzahl von Dateien in einem Ordner die größer" & @CRLF & _
					"                    als die mit x angegebene Größe sind und gibt die Anzahl zurück" & @CRLF & _
					"                    0 = keine Dateien gefunden, Ordner werden ignoriert, keine" & @CRLF & _
					"                    rekursion, Angabe der Größe in Bytes" & @CRLF & _
					@CRLF & _
					"#FileCountSize=x  : Wie zuvor, jedoch 'kleiner als' statt größer" & @CRLF & _
					@CRLF & _
					@CRLF & _
					"FileCountAge=x    : Zählt die Anzahl von Dateien in einem Ordner die älter" & @CRLF & _
					"                    als das mit x angegebene Alter sind und gibt die Anzahl zurück" & @CRLF & _
					"                    0 = keine Dateien gefunden, Ordner werden ignoriert, keine" & @CRLF & _
					"                    Rekursion, Angabe der Zeit in Sekunden" & @CRLF & _
					"                    Basis ist das Erstellungsdatum" & @CRLF & _
					@CRLF & _
					"#FileCountAge=x   : Wie zuvor, nur 'jünger sind' statt älter" & @CRLF & _
					@CRLF & _
					"FileModifyAge     : Liefert die Anzahl der vergangenen Sekunden seit der" & @CRLF & _
					"                     letzten Änderung einer Datei zurück" & @CRLF & _
					"                     -1 = Datei nicht gefunden" & @CRLF & _
					@CRLF & _
					"FileGetSize       : gibt die Dateigröße in Bytes zurück" & @CRLF & _
					"                     -1 = Datei nicht gefunden" & @CRLF & _
					@CRLF & _
					"FileGetVersion    : gibt die Dateiversion als Typ Char zurück" & @CRLF & _
					"                     -1 = Datei nicht gefunden" & @CRLF & _
					@CRLF & _
					"GetAttrib         : gibt die Datei- oder Verzeichnisattribute als Typ Char zurück" & @CRLF & _
					"                     -1 = Datei/Verzeichnis nicht gefunden" & @CRLF & _
					'                    Rückgabewert ist eine Kombination von "RASHNDOCTIPL":' & @CRLF & _
					'                      "R" = Read-Only' & @CRLF & _
					'                      "A" = Archive' & @CRLF & _
					'                      "S" = System' & @CRLF & _
					'                      "H" = Hidden' & @CRLF & _
					'                      "N" = Normal' & @CRLF & _
					'                      "D" = Directory' & @CRLF & _
					'                      "O" = Offline' & @CRLF & _
					'                      "C" = Compressed (NTFS compression, not ZIP compression)' & @CRLF & _
					'                      "T" = Temporay' & @CRLF & _
					'                      "I" = Not content-indexed' & @CRLF & _
					'                      "P" = Sparse File' & @CRLF & _
					'                      "L" = Symbolic Link / Junction' & @CRLF & _
					@CRLF & _
					"--Verbose         : Verbose Modus mit Anzeige der Prüfungen etc" & @CRLF & _
					"-------------------------------------------------------------------------------" & @CRLF & _
					" Im Fehlerfall (wenn z.B. ein ungültiger Parameter oder Ordner nicht gefunden)" & @CRLF & _
					" wird -1 zurück gegeben" & @CRLF & _
					"+------------------------------------------------------------------------------" & @CRLF & _
					"| FileandFolder.exe ist FREEWARE!" & @CRLF & _
					"| Kopieren, weitergeben ausdrücklich erlaubt!" & @CRLF & _
					"| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:" & @CRLF & _
					"| http://znil.net/index.php?title=Zabbix:Template_Windows_Dateien_und_Ordner" & @CRLF & _
					"+------------------------------------------------------------------------------" & @CRLF

; ###################################################################################
; F U N C T I O N E N / S U B R O U T I N E N
; ###################################################################################

; ###################################################################################
; _ANSI2OEM löst das Problem mit dem Umlauten und anderen Sonderzeichen. Es wandelt Text so um das er korrekt in der DOS-Box dargestellt wird
; So können hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt

Func _ANSI2OEM($text)
	$text = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $text, 'str', '')
	Return $text[2]
	;Return $text
EndFunc   ;==>_ANSI2OEM

; ###################################################################################
; Hilfsroutine die den Hilfetext ausgibt
Func _HilfeAusgeben()
	ConsoleWrite(_ANSI2OEM($s_Header))
	ConsoleWrite(_ANSI2OEM($s_HilfeText))
EndFunc   ;==>_HilfeAusgeben

; ###################################################################################
; Soll ganz toll ganze Verzeichnisbäume abgrasen können
;==================================================================================================
; Function Name:   _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description:     Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s):    $sPath     der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
;                  $sExt      Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
;                  $iDir      -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
;      optional:   $iRetType  0 gibt Array, 1 gibt String zurück
;      optional:   $sDelim    legt Trennzeichen für Stringrückgabe fest
;                             0 -@CRLF (Standard)  1 -@CR  2 -@LF  3 -';'  4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
;                  Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
        Case '1'
            $sDelim = @CR
        Case '2'
            $sDelim = @LF
        Case '3'
            $sDelim = ';'
        Case '4'
            $sDelim = '|'
        Case Else
            $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
        Local $aOut
        $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
        If $aOut[1] = '' Then
            ReDim $aOut[1]
            $aOut[0] = 0
        EndIf
        Return $aOut
    Else
        Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
EndFunc

Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
        For $file In $Folder.Files
            If $Ext <> '*' Then
                If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
                    $strFiles &= $file.Path & $Delim
            Else
                $strFiles &= $file.Path & $Delim
            EndIf
        Next
    EndIf
    For $Subfolder In $Folder.SubFolders
        If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
        _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
EndFunc

Func _VerboseConsoleWrite($s_VerboseText)
	If $b_Verbose = True Then
		ConsoleWrite(_ANSI2OEM($s_VerboseText) & @CRLF)
	EndIf
EndFunc


; ###################################################################################
; H I L F E
; ###################################################################################

;testen ob wir überhaupt mit einem Parameter gestartet wurden - sonst Hilfe ausgeben
;~ If $CmdLine[0] = 0 Then
;~ 	_HilfeAusgeben()
;~ 	Exit 0
;~ EndIf

;testen ob der Parameter 1 ist auf "/?" testen und ebenfalls Hilfe ausgeben
If $CmdLine[0] = 0 Then
	_HilfeAusgeben()
	Exit 0
EndIf

If $CmdLine[1] = "/?" Then
	_HilfeAusgeben()
	Exit 0
EndIf

If $CmdLine[0] >= 3 Then
	If $CmdLine[3] = "--Verbose" Then
		$b_Verbose = True
		ConsoleWrite("Aufruf von " & @ScriptName & " mit folgenden Parametern:" & @CRLF)
		For $i = 1 To $CmdLine[0]
			ConsoleWrite("Parameter " & $i & ": " & $CmdLine[$i] & @CRLF)
		Next
	EndIf
EndIf

; Restliche Parameter auswerten und Variablen füllen ########################################################
; ##############################################################################################
If $CmdLine[1] = "FileCount" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = $CmdLine[2]
	If StringRight($s_Path,1) <> "\" Then
		$s_Path = $s_Path & "\"
	EndIf
	$i_Zaehler = 0
	If StringInStr(FileGetAttrib($CmdLine[2]), "D") > 0 Then
		_VerboseConsoleWrite("Hole Zeiger auf Verzeichnis")
		$h_suchhandle = FileFindFirstFile($s_Path & "*")
		_VerboseConsoleWrite("Zähle Dateien")
		While @error <> 1
			$i_Zaehler = $i_Zaehler + 1
			If $b_Verbose = True Then
				ConsoleWrite(".")
			EndIf
			$s_temp	= FileFindNextFile($h_suchhandle)
		WEnd
		If $i_Zaehler > 0 Then
			$i_Zaehler = $i_Zaehler - 1
		EndIf
		_VerboseConsoleWrite(" fertig!")
		ConsoleWrite($i_Zaehler & @CRLF)
		FileClose($h_suchhandle)
		Exit $i_Zaehler
	Else
		_VerboseConsoleWrite($CmdLine[2] & " ist kein Verzeichnis!")
		_VerboseConsoleWrite(FileGetAttrib($CmdLine[2]))
		ConsoleWrite("-1" & @CRLF)
		FileClose($h_suchhandle)
		Exit -1
	EndIf
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileCountR" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = $CmdLine[2]
	If StringRight($s_Path,1) <> "\" Then
		$s_Path = $s_Path & "\"
	EndIf
	$i_Zaehler = 0
	If StringInStr(FileGetAttrib($CmdLine[2]), "D") > 0 Then
		$a_dateiliste = _GetFilesFolder_Rekursiv($s_Path)
		ConsoleWrite($a_dateiliste[0] & @CRLF)
		Exit $a_dateiliste[0]
	Else
		_VerboseConsoleWrite($CmdLine[2] & " ist kein Verzeichnis!")
		_VerboseConsoleWrite(FileGetAttrib($CmdLine[2]))
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileCountR2" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = $CmdLine[2]
	If StringRight($s_Path,1) <> "\" Then
		$s_Path = $s_Path & "\"
	EndIf
	$i_Zaehler = 0
	If StringInStr(FileGetAttrib($CmdLine[2]), "D") > 0 Then
		$a_dateiliste = _GetFilesFolder_Rekursiv($s_Path, "*", 0)
		ConsoleWrite($a_dateiliste[0] & @CRLF)
		Exit $a_dateiliste[0]
	Else
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileFindCount" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = StringReplace($CmdLine[2],"%","*") ; alle % durch * da Zabbix den * nicht mag
	$s_Path = StringReplace($s_Path, "/", "\")
	_VerboseConsoleWrite("Übergebender Suchparameter ist  : " & $CmdLine[2])
	_VerboseConsoleWrite("Umgewandelter Suchparamater ist : " & $s_Path)
	$i_Zaehler = 0
	$h_suchhandle = FileFindFirstFile($s_Path)
	While @error <> 1
		$i_Zaehler = $i_Zaehler + 1
		$s_temp	= FileFindNextFile($h_suchhandle)
		If $s_temp <> "" Then
			_VerboseConsoleWrite($i_Zaehler & ": Datei gefunden : '" & $s_temp & "'")
		EndIf
	WEnd
	If $i_Zaehler > 0 Then
		$i_Zaehler = $i_Zaehler - 1
	EndIf
	If $i_Zaehler = -1 Then
		$i_Zaehler = 0
	EndIf
	ConsoleWrite($i_Zaehler & @CRLF)
	Exit $i_Zaehler
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileCreateAge" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	If FileExists($CmdLine[2]) = 0 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$a_dateizeit = FileGetTime($CmdLine[2],1) ; 1 = erstellt
	; Das Array ist ein 1-dimensionales Array, das sechs Elemente enthält:
		; $array[0] = Jahr (vierstellig)
		; $array[1] = Monat (Bereich: 01 - 12)
		; $array[2] = Tag (Bereich: 01 - 31)
		; array[3] = Stunden (Bereich: 00 - 23)
		; $array[4] = Minuten (Bereich: 00 - 59)
		; $array[5] = Sekunden (Bereich: 00 - 59)
		; Es ist zu beachten, dass die Rückgabewerte bei Bedarf mit Nullen aufgefüllt sind.
	$i_Sekunden = _DateDiff("s", $a_dateizeit[0] & "/" & $a_dateizeit[1] & "/" & $a_dateizeit[2] & " " & $a_dateizeit[3] & ":" & $a_dateizeit[4] & ":" & $a_dateizeit[5], _NowCalc())
		; $sType Auswählen, wie die Differenz zurückgegeben werden soll:
		; D - in Tagen
		; M - in Monaten
		; Y - in Jahren
		; w - in Wochen
		; h - in Stunden
		; n - in Minuten
		; s - in Sekunden
	ConsoleWrite($i_Sekunden & @CRLF)
	Exit $i_Sekunden
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileModifyAge" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	If FileExists($CmdLine[2]) = 0 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$a_dateizeit = FileGetTime($CmdLine[2],0) ; 0 = geändert
	$i_Sekunden = _DateDiff("s", $a_dateizeit[0] & "/" & $a_dateizeit[1] & "/" & $a_dateizeit[2] & " " & $a_dateizeit[3] & ":" & $a_dateizeit[4] & ":" & $a_dateizeit[5], _NowCalc())
		; $sType Auswählen, wie die Differenz zurückgegeben werden soll:
		; D - in Tagen
		; M - in Monaten
		; Y - in Jahren
		; w - in Wochen
		; h - in Stunden
		; n - in Minuten
		; s - in Sekunden
	ConsoleWrite($i_Sekunden & @CRLF)
	Exit $i_Sekunden
EndIf
; ##############################################################################################
If $CmdLine[1] = "GetAttrib" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = StringReplace($CmdLine[2], "/", "\")
	_VerboseConsoleWrite("Übergebende Datei/Ordner ist : " & $CmdLine[2])
	_VerboseConsoleWrite("Umgewandelter Pfad ist       : " & $s_Path)
	If FileExists($s_Path) = 0 Then
		_VerboseConsoleWrite("Datei/Verzeichnis nicht vorhanden!")
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_temp = FileGetAttrib($s_Path)
	ConsoleWrite($s_temp & @CRLF)
	Exit
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileGetSize" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	If FileExists($CmdLine[2]) = 0 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$i_Dateigroesse = FileGetSize($CmdLine[2])
	ConsoleWrite($i_Dateigroesse & @CRLF)
	Exit
EndIf
; ##############################################################################################
If $CmdLine[1] = "FileGetVersion" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	If FileExists($CmdLine[2]) = 0 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_temp = FileGetVersion($CmdLine[2])
	ConsoleWrite($s_temp & @CRLF)
	Exit
EndIf
; ##############################################################################################
If $CmdLine[1] = "DirGetSize" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	If FileExists($CmdLine[2]) = 0 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$i_Dateigroesse = DirGetSize($CmdLine[2])
	ConsoleWrite($i_Dateigroesse & @CRLF)
	Exit $i_Dateigroesse
EndIf
; ##############################################################################################
If StringLeft($CmdLine[1], StringLen("FileCountSize=")) = "FileCountSize=" Or StringLeft($CmdLine[1], StringLen("#FileCountSize=")) = "#FileCountSize=" Then
	If StringLeft($CmdLine[1], 1) = "#" Then
		$i_DateiSuchGroesse = Int(StringReplace($CmdLine[1], "#FileCountSize=", ""))
		$b_Inverse = True
		If $b_Verbose = True Then
			ConsoleWrite("Suche Dateien die kleiner sind als ")
		EndIf
	Else
		$i_DateiSuchGroesse = Int(StringReplace($CmdLine[1], "FileCountSize=", ""))
		$b_Inverse = False
		If $b_Verbose = True Then
			ConsoleWrite(_ANSI2OEM("Suche Dateien die größer sind als "))
		EndIf
	EndIf
	_VerboseConsoleWrite($i_DateiSuchGroesse & " Bytes")
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = $CmdLine[2]
	If StringRight($s_Path,1) <> "\" Then
		$s_Path = $s_Path & "\"
	EndIf
	$i_Zaehler = 0
	If StringInStr(FileGetAttrib($CmdLine[2]), "D") > 0 Then
		$h_suchhandle = FileFindFirstFile($s_Path & "*")
		While @error <> 1
			$s_temp	= FileFindNextFile($h_suchhandle)
			If @error = 1 Then
				ExitLoop
			EndIf
			If StringInStr(FileGetAttrib($s_temp), "D") = 0 Then
				If $b_Inverse = False Then
					If FileGetSize($s_Path & $s_temp) >= $i_DateiSuchGroesse Then
						_VerboseConsoleWrite("Treffer : " & $s_temp & " : " & FileGetSize($s_Path & $s_temp) & " >= " & $i_DateiSuchGroesse)
						$i_Zaehler = $i_Zaehler + 1
					Else
						_VerboseConsoleWrite("zu klein : " & $s_temp & " : " & FileGetSize($s_Path & $s_temp) & " < " & $i_DateiSuchGroesse)
					EndIf
				Else
					If FileGetSize($s_Path & $s_temp) <= $i_DateiSuchGroesse Then
						_VerboseConsoleWrite("Treffer : " & $s_temp & " : " & FileGetSize($s_Path & $s_temp) & " <= " & $i_DateiSuchGroesse)
						$i_Zaehler = $i_Zaehler + 1
					Else
						_VerboseConsoleWrite("zu groß : " & $s_temp & " : " & FileGetSize($s_Path & $s_temp) & " < " & $i_DateiSuchGroesse)
					EndIf
				EndIf
			EndIf
		WEnd
		ConsoleWrite($i_Zaehler & @CRLF)
		FileClose($h_suchhandle)
		Exit $i_Zaehler
	Else
		_VerboseConsoleWrite($CmdLine[2] & " ist kein Verzeichnis!" & @CRLF)
		_VerboseConsoleWrite(FileGetAttrib($CmdLine[2]) & @CRLF)
		ConsoleWrite("-1" & @CRLF)
		FileClose($h_suchhandle)
		Exit -1
	EndIf
EndIf
; ##############################################################################################
If StringLeft($CmdLine[1], StringLen("FileCountAge=")) = "FileCountAge=" Or StringLeft($CmdLine[1], StringLen("#FileCountAge=")) = "#FileCountAge=" Then
	If StringLeft($CmdLine[1], 1) = "#" Then
		$i_DateiSuchAlter = Int(StringReplace($CmdLine[1], "#FileCountAge=", ""))
		$b_Inverse = True
	Else
		$i_DateiSuchAlter = Int(StringReplace($CmdLine[1], "FileCountAge=", ""))
		$b_Inverse = False
	EndIf
	;ConsoleWrite("Dateisuchgroesse = '" & $i_DateiSuchAlter & "'" & @CRLF)
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	$s_Path = $CmdLine[2]
	If StringRight($s_Path,1) <> "\" Then
		$s_Path = $s_Path & "\"
	EndIf
	$i_Zaehler = 0
	If StringInStr(FileGetAttrib($CmdLine[2]), "D") > 0 Then
		$h_suchhandle = FileFindFirstFile($s_Path & "*")
		While @error <> 1
			$s_temp	= FileFindNextFile($h_suchhandle)
			If @error = 1 Then
				ExitLoop
			EndIf
			If StringInStr(FileGetAttrib($s_temp), "D") = 0 Then
				$a_dateizeit = FileGetTime($s_Path & $s_temp, 1) ; 1 = erstellt
				; Das Array ist ein 1-dimensionales Array, das sechs Elemente enthält:
				; $array[0] = Jahr (vierstellig)
				; $array[1] = Monat (Bereich: 01 - 12)
				; $array[2] = Tag (Bereich: 01 - 31)
				; array[3] = Stunden (Bereich: 00 - 23)
				; $array[4] = Minuten (Bereich: 00 - 59)
				; $array[5] = Sekunden (Bereich: 00 - 59)
				; Es ist zu beachten, dass die Rückgabewerte bei Bedarf mit Nullen aufgefüllt sind.
				$i_Sekunden = _DateDiff("s", $a_dateizeit[0] & "/" & $a_dateizeit[1] & "/" & $a_dateizeit[2] & " " & $a_dateizeit[3] & ":" & $a_dateizeit[4] & ":" & $a_dateizeit[5], _NowCalc())
				If $b_Inverse = False Then
					If $i_Sekunden >= $i_DateiSuchAlter Then
						_VerboseConsoleWrite("Treffer : " & $s_temp & " : " & $i_DateiSuchAlter & " <= " & $i_Sekunden)
						$i_Zaehler = $i_Zaehler + 1
					Else
						_VerboseConsoleWrite("zu neu : " & $s_temp & " : " & $i_DateiSuchAlter & " > " & $i_Sekunden)
					EndIf
				Else
					If $i_Sekunden <= $i_DateiSuchAlter Then
						_VerboseConsoleWrite("Treffer : " & $s_temp & " : " & $i_DateiSuchAlter & " <= " & $i_Sekunden)
						$i_Zaehler = $i_Zaehler + 1
					Else
						_VerboseConsoleWrite("zu alt : " & $s_temp & " : " & $i_DateiSuchAlter & " > " & $i_Sekunden)
					EndIf
				EndIf
			EndIf
		WEnd
		ConsoleWrite($i_Zaehler & @CRLF)
		FileClose($h_suchhandle)
		Exit $i_Zaehler
	Else
		_VerboseConsoleWrite($CmdLine[2] & " ist kein Verzeichnis!")
		_VerboseConsoleWrite(FileGetAttrib($CmdLine[2]))
		ConsoleWrite("-1" & @CRLF)
		FileClose($h_suchhandle)
		Exit -1
	EndIf
EndIf

; ##############################################################################################
;~ 	Case Else
ConsoleWrite(_ANSI2OEM("Unbekannter Parameter: " & $CmdLine[1] & @CRLF))
Exit 1




7 Kommentare


asdfearve@nuerfuerspam.de

43 Monaten zuvor
Punktzahl 0++

Hallo,

erstmal danke für das Template!

Ich habe bei Verwendung von DirGetSize einen Timeout bei einem recht umfangreichen Ordner 457.000 Dateien und 371GB Umfang. Fehlermeldung: Timeout while Executing a Shell Script.

Gibt es eine Möglichkeit dies zu korrigieren?

Ein "Rechte Maustaste" und Eigenschaften dauert ca. 4min.

BLinz

43 Monaten zuvor
Punktzahl 0++

Das Zeitfenster in Zabbix für so etwas ist maximal 30 Sekunden. Alternativ müsste die Abfrage als Aufgabe / Scheduled Task laufen und das Ergebnis per zabbix_sender.exe an den Host senden.

Dieses meiner Tools kann das nicht direkt.

rsato

21 Monaten zuvor
Punktzahl 0++

Hallo, ich test gerade dieses Template. Besonders interessiere ich mich fuer das Messen von Ordner mit deren Unterverzeichnissen.

Dabei musste ich feststellen, das der Befehl "DirGetSize" nur die Dateien aus dem Verzeichnis misst und die Inhalte aus Unterverzeichnissen links liegen laesst. Gibt es dazu ein Work around?

(Getestet auf Windows Server 2012 R2 Datacenter 64-bit)

mueller@begasoft.ch

20 Monaten zuvor
Punktzahl 0++

Hallo Das Tool ist super, setzen wir nun doch schon das eine oder andere mal ein. Ich habe nun aber die Aufgabe nach einem bestimmten alter (FileCountAge) und nach einer bestimmten Dateiendung (FileFindCount) zu suchen. Gibt es eine Möglichkeit diese beiden zu kombinieren?

Danke und Gruss

BLinz

20 Monaten zuvor
Punktzahl 0++

Im Quelltext z.B. bei FileCountAge steht die Suchmaske:

$h_suchhandle = FileFindFirstFile($s_Path & "*")

Das * müsste man nur das gewünschte Pattern ersetzen, dann hättest du was du willst.

Man müsste also nur die Suchmaske mit angeben ... ich schau mal ob ich das Parameter hinzufügen kann

BLinz

20 Monaten zuvor
Punktzahl 0++

Gibt jetzt eine neue Version (Beispiel 4), die kann das. In dem Item-Key einfach hinter den Pfad noch ein ",*.txt" oder ähnlich setzen.

znil.fileandfolder[FileCountAge=3600,C:/Windows/System32/,*.txt]

dassmann

6 Monaten zuvor
Punktzahl 0++
Hallo. Wirklich eine super Sache die sie da geschrieben haben. Ich habe nur ein kleines Problem. Bei den Item-Keys mit einer # (znil.fileandfolder[#FileCountAge=86400,D:/SQL-Backup]) bekomme ich die Fehlermeldung "Special characters "\, ', ", `, *, ?, [, ], {, }, ~, $, !, &, ;, (, ), <, >, |, #, @, 0x0a" are not allowed in the parameters." Woran kann das liegen?
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.