Aktionen

Zabbix:Template Windows Dateien und Ordner: Unterschied zwischen den Versionen

Aus znilwiki

KKeine Bearbeitungszusammenfassung
Zeile 9: Zeile 9:
<br>
<br>
----
----
{{Warnung|Zumindest mit dem 4.4er Zabbix Agenten scheint es ein Problem mit dem Suchmuster bei FileAgeCount und FileCountSize zu geben. Wird diese nicht angegeben so wird per Default <code>*</code> genommen. Liefert er - in Zabbix - immer 0 obwohl das nicht stimmt so setzt den 3. Parameter mit <code>*</code>. Der Fehler taucht bei manuellen direkten Tests nicht auf, nur wenn derAufruf übe rden Zabbix-Agenten erfolgt.}}<br>
<big>Download: '''[[Media:Zabbix-FileAndFolder.zip|Zabbix-FileAndFolder.zip]]'''</big>
<big>Download: '''[[Media:Zabbix-FileAndFolder.zip|Zabbix-FileAndFolder.zip]]'''</big>
----
----

Version vom 21. August 2020, 12:21 Uhr

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.


Warning.png
Warnung: Zumindest mit dem 4.4er Zabbix Agenten scheint es ein Problem mit dem Suchmuster bei FileAgeCount und FileCountSize zu geben. Wird diese nicht angegeben so wird per Default * genommen. Liefert er - in Zabbix - immer 0 obwohl das nicht stimmt so setzt den 3. Parameter mit *. Der Fehler taucht bei manuellen direkten Tests nicht auf, nur wenn derAufruf übe rden Zabbix-Agenten erfolgt.


Download: Zabbix-FileAndFolder.zip


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: Neue Version 3.0.0.5
    • Neu: Bei den Parametern FileCountSize und FileCountAge kann man nun als 3. Parameter eine Suchmaske für Dateien angeben
  • 30.04.2020: Neue Version 4.0.0.2
    • Neu: DirExists - die in Zabbix eingebaute Prüfung kann nur auf Dateien prüfen
  • 21.08.2020: Version 4.0.0.3
    • Fehler im Zusammenhang mit FileAgeCount und --verbose behoben




Screenshots

ClipCapIt-200430-113036.PNG
ClipCapIt-200430-113213.PNG

Und hier die Items dazu:
ClipCapIt-200430-113439.PNG
ClipCapIt-200430-113523.PNG



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

DirExists         : prüft ob ein Verzeichnis existiert
                     0 = Verzeichnis nicht gefunden
                     1 = Verzeichnis 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





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




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




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




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




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!




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!
In neueren Zabbix Versionen funktioniert scheinbar beides. Die fileandfolder.exe kann auch mit beidem umgehen.


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.



Quellcode

Wie fast immer im AutoIt geschrieben:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_Outfile=fileandfolder.exe
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Comment=2014-2020 von Bernhard Linz / Bernhard@znil.de
#AutoIt3Wrapper_Res_Description=FileAndFolder.exe Zabbix Helper
#AutoIt3Wrapper_Res_Fileversion=4.0.0.4
#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
Dim $s_Suchmuster = "*"
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> [Suchmaske] [--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 & _
					"DirExists         : prüft ob ein Verzeichnis existiert" & @CRLF & _
					"                      0 = Verzeichnis nicht gefunden" & @CRLF & _
					"                      1 = Verzeichnis gefunden" & @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 & _
					'[Suchmaske]       : Schränkt bei Verzeichnisbefehlen auf Dateien entsprechend' & @CRLF & _
					'                    dieser Maske ein, z.B. *.txt - Funktioniert mit:' & @CRLF & _
					'                    FileCountSize, FileCountAge' & @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 StringInStr($CmdLineRaw, "--verbose") > 0 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

; 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 $CmdLine[1] = "DirExists" Then
	If $CmdLine[0] < 2 Then
		ConsoleWrite("-1" & @CRLF)
		Exit -1
	EndIf
	If FileExists($CmdLine[2]) = 0 Then
		ConsoleWrite("0" & @CRLF)
	Else
		ConsoleWrite("1" & @CRLF)
	EndIf
	Exit 0
EndIf
; ##############################################################################################
If StringLeft($CmdLine[1], StringLen("FileCountSize=")) = "FileCountSize=" Or StringLeft($CmdLine[1], StringLen("#FileCountSize=")) = "#FileCountSize=" Then
	If $CmdLine[0] > 2 Then
		$s_Suchmuster = $CmdLine[3]
	Else
		$s_Suchmuster = "*"
	EndIf
	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 & $s_Suchmuster)
		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 $CmdLine[0] > 2 Then
		$s_Suchmuster = $CmdLine[3]
	Else
		$s_Suchmuster = "*"
	EndIf
	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 & $s_Suchmuster)
		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




Kommentare

Loading comments...