Zabbix:Template Windows Dateien und Ordner: Unterschied zwischen den Versionen
Aus znilwiki
BLinz (Diskussion | Beiträge) |
BLinz (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 25: | Zeile 25: | ||
* 30.04.2020: Neue Version 4.0.0.2 | * 30.04.2020: Neue Version 4.0.0.2 | ||
** Neu: DirExists - die in Zabbix eingebaute Prüfung kann nur auf Dateien prüfen | ** Neu: DirExists - die in Zabbix eingebaute Prüfung kann nur auf Dateien prüfen | ||
* 21.08.2020: Version 4.0.0.7 | |||
** Fehler im Zusammenhang mit FileAgeCount und Suchparameter behoben | |||
<br> | <br> | ||
<br> | <br> | ||
Zeile 215: | Zeile 217: | ||
In dem Beispiel-Template sind sowohl Abfragen drin wecleh die von mir programmierte <code>fileandfolder.exe</code> nutzen als auch Abfragen welche die im Zabbix-Agenten integriert sind <code>vfs.file.xxx</code><br> | In dem Beispiel-Template sind sowohl Abfragen drin wecleh die von mir programmierte <code>fileandfolder.exe</code> nutzen als auch Abfragen welche die im Zabbix-Agenten integriert sind <code>vfs.file.xxx</code><br> | ||
Generell gilt der Hinweis:<br> | Generell gilt der Hinweis:<br> | ||
{{Hinweis|<br>In allen Pfaden den "/" statt dem "\" nutzen!<br>In neueren Zabbix Versionen funktioniert scheinbar beides. Die '''fileandfolder.exe''' kann auch mit beidem umgehen.}}<br> | {{Hinweis|<br><br>In allen Pfaden den "/" statt dem "\" nutzen!<br>In neueren Zabbix Versionen funktioniert scheinbar beides. Die '''fileandfolder.exe''' kann auch mit beidem umgehen.}}<br> | ||
Die Zabbix-Internen abfragen kommen zwar auch mit dem Backslash "\" aus ... aber bei der Übergaben an die <code>fileandfolder.exe</code> ging das regelmäßig schief - deshalb die Linux-Schreibweise.<br> | Die Zabbix-Internen abfragen kommen zwar auch mit dem Backslash "\" aus ... aber bei der Übergaben an die <code>fileandfolder.exe</code> ging das regelmäßig schief - deshalb die Linux-Schreibweise.<br> | ||
Aus dem gleichen Grund muss bei den Dateisuchoptionen ein <code>%</code> statt dem <code>*</code> angebeben werden. Das <code>?</code> kann ganz normal genutzt werden.<br> | Aus dem gleichen Grund muss bei den Dateisuchoptionen ein <code>%</code> statt dem <code>*</code> angebeben werden. Das <code>?</code> kann ganz normal genutzt werden.<br> | ||
Zeile 233: | Zeile 235: | ||
#AutoIt3Wrapper_Res_Comment=2014-2020 von Bernhard Linz / Bernhard@znil.de | #AutoIt3Wrapper_Res_Comment=2014-2020 von Bernhard Linz / Bernhard@znil.de | ||
#AutoIt3Wrapper_Res_Description=FileAndFolder.exe Zabbix Helper | #AutoIt3Wrapper_Res_Description=FileAndFolder.exe Zabbix Helper | ||
#AutoIt3Wrapper_Res_Fileversion=4.0.0. | #AutoIt3Wrapper_Res_Fileversion=4.0.0.8 | ||
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y | #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y | ||
#AutoIt3Wrapper_Res_SaveSource=y | #AutoIt3Wrapper_Res_SaveSource=y | ||
Zeile 728: | Zeile 730: | ||
EndIf | EndIf | ||
If $s_Suchmuster = "--verbose" Then | If $s_Suchmuster = "--verbose" Then | ||
$s_Suchmuster = "*" | |||
EndIf | |||
If $s_Suchmuster = "" Then | |||
$s_Suchmuster = "*" | $s_Suchmuster = "*" | ||
EndIf | EndIf | ||
Zeile 793: | Zeile 798: | ||
If $CmdLine[0] > 2 Then | If $CmdLine[0] > 2 Then | ||
$s_Suchmuster = $CmdLine[3] | $s_Suchmuster = $CmdLine[3] | ||
EndIf | |||
If $b_Verbose = True Then | |||
ConsoleWrite("Aufruf Unterroutine mit folgenden Parametern:" & @CRLF) | |||
ConsoleWrite('$s_Suchmuster Anfangs .: "' & $s_Suchmuster & '"' & @CRLF) | |||
EndIf | EndIf | ||
If $s_Suchmuster = "--verbose" Then | If $s_Suchmuster = "--verbose" Then | ||
$s_Suchmuster = "*" | $s_Suchmuster = "*" | ||
EndIf | EndIf | ||
If $s_Suchmuster = "" Then | |||
$s_Suchmuster = "*" | |||
EndIf | |||
If StringLeft($CmdLine[1], 1) = "#" Then | If StringLeft($CmdLine[1], 1) = "#" Then | ||
$i_DateiSuchAlter = Int(StringReplace($CmdLine[1], "#FileCountAge=", "")) | $i_DateiSuchAlter = Int(StringReplace($CmdLine[1], "#FileCountAge=", "")) | ||
Zeile 812: | Zeile 825: | ||
If StringRight($s_Path,1) <> "\" Then | If StringRight($s_Path,1) <> "\" Then | ||
$s_Path = $s_Path & "\" | $s_Path = $s_Path & "\" | ||
EndIf | |||
If $b_Verbose = True Then | |||
ConsoleWrite('$s_Suchmuster bei Start: "' & $s_Suchmuster & '"' & @CRLF) | |||
ConsoleWrite('$s_Path ...............: "' & $s_Path & '"' & @CRLF) | |||
ConsoleWrite('$i_DateiSuchAlter .....: "' & $i_DateiSuchAlter & '"' & @CRLF) | |||
ConsoleWrite('$b_Inverse ............: "' & $b_Inverse & '"' & @CRLF) | |||
EndIf | EndIf | ||
$i_Zaehler = 0 | $i_Zaehler = 0 |
Aktuelle Version vom 21. August 2020, 12:42 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.
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.7
- Fehler im Zusammenhang mit FileAgeCount und Suchparameter behoben
Screenshots
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)
--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:
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.8
#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]
EndIf
If $s_Suchmuster = "--verbose" Then
$s_Suchmuster = "*"
EndIf
If $s_Suchmuster = "" Then
$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]
EndIf
If $b_Verbose = True Then
ConsoleWrite("Aufruf Unterroutine mit folgenden Parametern:" & @CRLF)
ConsoleWrite('$s_Suchmuster Anfangs .: "' & $s_Suchmuster & '"' & @CRLF)
EndIf
If $s_Suchmuster = "--verbose" Then
$s_Suchmuster = "*"
EndIf
If $s_Suchmuster = "" Then
$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
If $b_Verbose = True Then
ConsoleWrite('$s_Suchmuster bei Start: "' & $s_Suchmuster & '"' & @CRLF)
ConsoleWrite('$s_Path ...............: "' & $s_Path & '"' & @CRLF)
ConsoleWrite('$i_DateiSuchAlter .....: "' & $i_DateiSuchAlter & '"' & @CRLF)
ConsoleWrite('$b_Inverse ............: "' & $b_Inverse & '"' & @CRLF)
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