it-capitain
Goto Top

Pfade aus CSV mit Powershell überwachen

Hallo zusammen,

ich soll mehrere Pfade mit PowerShell überwachen. Die Pfade sind in einer CSV Datei enthalten:

Aufbau CSV

Path
C:\Test
C:\Test2
etc.

Ich hätte das jetzt via PowerShell in ein Array gepackt und dann in einer Schleife überwachen wollen, nur leider sind meine PowerShell Skills ungefähr so wie meine Skills als Sushikoch ;)

Jemand einen Tipp wie man damit am besten umgehen kann und soll?

Freue mich über Tipps.

Danke und schönen Abend.

Content-ID: 2762337614

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

Crusher79
Crusher79 12.05.2022 aktualisiert um 21:24:25 Uhr
Goto Top
Hallo,

ja so ungefähr. Was überwachen? Datei Änderung? Neue Dateien? Was soll damit passieren?

Was ist wenn niemand angemeldet ist? Als Dienst gewünscht?

Lock mit einbauen? Wenn Script läuft, quasi mit running.lck verhindern, dass es erneut gestartet wird? Kannn auch mal Probleme machen. Lock dann manuell entfernen oder via Function weglöschen und neu erstellen lassen? Damit es sich nicht totrennt....

Was aber ist das Ziel? Bei Datum auf Modify und Creation Date achten. Nicht immer ändert sich letzteres -NTFS Tunnel.

https://www.msxfaq.de/code/filsystemtunnel.htm


Dat Ding nennt sich auf den Markt auch mal "Hotfolder". Kannst das ja mal in die Suche einbeziehen.
IT-Capitain
IT-Capitain 13.05.2022 um 08:38:06 Uhr
Goto Top
Es soll überwacht werden, ob Dateien die alter als zB 10min. in dem Pfad liegen.
Das ganze wird als Script auf Nagios Basis laufen.
Crusher79
Crusher79 13.05.2022 aktualisiert um 08:57:13 Uhr
Goto Top
Achso. Ja kein Ding. Hat ich selber mal gebaut um eingescannte Dokument zu prüfen. Ob sie vom Mirth Server auch brav ins DMS gebeamt werden.

Alle paar Minuten geprüft und dann ist gut.

10 - 15 min. heisst aber auch, dass wir hier auf eine Dauer Schleife verzichten können. Also iterieren der CSV JA, aber nicht im Script bleiben. Reicht wenn man es über Taskplaner dann erneut alle x min. aufruft.

Nagios länger nicht gehabt. Was verlangt die Schnittstelle? Antwort von der PS als Parameter? Also wie pumpen wir unser Ergebnis rein? Da müsstest mir mal kurz helfen.


Hier mal Snippet von mir! Nicht volltändig! -9 min und Datei wird für E-Mail Versand (Attachmend) vorbereitet. Du kannst also damit in der inneren Schleife dann auch pro Datei was auslösen. In deinen Fall aber wohl nicht gewünscht.

$heute = (Get-Date ).AddMinutes(-9).ToString('MM\/dd\/yyyy HH:mm:ss')  
$timestamp = (Get-Date ).ToString('yyyyMMdd_HHmmss_')  

$files=Get-ChildItem "F:\convert2epa\" | Where-Object {-not $_.PSIsContainer  -and $_.CreationTime -lt $heute }   

Foreach($file in $files)
{
$SourceFile=$file.FullName
$ErrorFolder=$file.DirectoryName + "\Error2Mail\"  
$ErrorFolderFile=$file.DirectoryName + "\Error2Mail\"+$timestamp+$file.Name  

Write-Host “Attaching File :- ” $ErrorFolderFile

Move-Item $SourceFile $ErrorFolder -Force

$alt =$ErrorFolder + $file.Name 
$neu = $timestamp +  $file.Name 

Rename-Item -Path $alt -NewName $neu

$attachment = New-Object System.Net.Mail.Attachment –ArgumentList $ErrorFolderFile

$msg.Attachments.Add($attachment)

}
colinardo
colinardo 13.05.2022 aktualisiert um 09:38:38 Uhr
Goto Top
Servus.
Hatten wir hier zwar schon diverse Threads zu, aber ist halt wie immer ...
Ausgehend von eine so formatierten Datei
Path
C:\Test
C:\Test2
In den Taskplaner gepackt (Pfade und Ausgabe natürlich an deine Bedürfnisse anpassen)
$csv = Import-CSV  'E:\pfade.csv' -Delimiter ";"  
$csv.Path | ?{Get-ChildItem $_ -File -EA SIlentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}} | %{
        "'$_' hat Dateien älter als 10 Minuten."  
}

Oder als Dauerschleife (schlechter zu managen und abzufragen).
$csv = Import-CSV  'E:\pfade.csv' -Delimiter ";"  
while($true){
    $csv.Path | ?{Get-ChildItem $_ -File -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}} | %{
        write-host "'$_' hat Dateien älter als 10 Minuten."  
    }
    sleep -Seconds 60
}
Grüße Uwe
Marabunta
Marabunta 13.05.2022 um 09:02:51 Uhr
Goto Top
Sinn macht es einen Task zu erstellen, der Powershell aufruft und das einmal durchlaufen lässt. Das Ergebnis kann dann Richtung Nagios geschickt werden.
Wenn da nur eine Liste mit Pfaden drin steht, braucht es keine CSV dafür

Ist jetzt nicht getestet oder optimiert:
$Pfade=Get-Content "c:\Pfade.csv"  
$Datum=Get-Date

foreach($Pfad in $Pfade){
Get-Childitem -recurse $Pfad |%{
if($_.LastWriteTime -lt ($Datum.AddMinutes(-10))){
$aelter=$true
break
}
}
}
if($aelter){
return 1
}else{return 0}
IT-Capitain
IT-Capitain 13.05.2022 um 11:23:53 Uhr
Goto Top
Vielen Dank schon einmal an alle. Folgendes habe ich jetzt zusammengebaut und ins Nagios integriert.

$NagiosStatus = 0
$csv = Import-CSV  'Scripts\test.csv'  


    $csv.Pfad | ?{Get-ChildItem $_ -File -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}} 

If($csv.Pfad -eq $null ){
$NagiosStatus = 1
} 
else {
$NagiosStatus = 0
}

# Ausgabe der Stati ans Monitoring
if ($NagiosStatus -eq 1) {
	Write-Host "Warning: '$_' hat Dateien älter als 10 Minuten sind. $($NagiosOutput)"  
    $host.SetShouldExit(1)
} 
else{
	Write-Host "OK. $($NagiosOutput)"  
	$host.SetShouldExit(0)
}

Irgendwo ist aber noch ein Logikfehler drin, da immer der Status "Ok" ausgegeben wird, auch wenn "uralte" Dateien in den zu überwachenden Pfaden enthalten sind.
colinardo
Lösung colinardo 13.05.2022 aktualisiert um 11:37:27 Uhr
Goto Top
Jepp das geht so nicht, das sollte das machen was du vorhast, wenn die Überschrift der CSV tatsächlich "Pfad" und nicht "Path" wie oben geschrieben ist und der Pfad auch stimmt.
$csv = Import-CSV '.\Scripts\test.csv'  
$pathes = $csv.Pfad | ?{Get-ChildItem $_ -File -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}}
if ($pathes) {
    Write-Host "Warning: In the following pathes are files oder than 10 minutes:`n$($pathes -join "`n")"  
    $host.SetShouldExit(1)
}else{
    Write-Host "OK."  
    $host.SetShouldExit(0)
}
IT-Capitain
IT-Capitain 13.05.2022 um 13:12:06 Uhr
Goto Top
Das klappt ;) Danke. Die Check Intervalle kann ich ja direkt im Nagios definieren.
IT-Capitain
IT-Capitain 13.05.2022 um 15:45:13 Uhr
Goto Top
Wie bekomme ich denn noch untergebracht, dass nur spezielle Filetypes geprüft werden sollen und keine Ordner?

Habe es mit den Filetypes via -Include *.xml getestet, aber da startet das Script nicht mehr
colinardo
Lösung colinardo 13.05.2022 aktualisiert um 16:17:40 Uhr
Goto Top
Zitat von @IT-Capitain:

Wie bekomme ich denn noch untergebracht, dass nur spezielle Filetypes geprüft werden sollen und keine Ordner?

Bei mehreren Endungen und bei nicht rekursiver Suche muss ein Wildcard zum Pfad hinzugefügt werden.
$pathes = $csv.Pfad | ?{Get-ChildItem "$_\*" -File -Include *.xml,*.zip -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}}  
Oder falls es nur eine Erweiterung sein sollte dann mittels Filter
$pathes = $csv.Pfad | ?{Get-ChildItem $_ -File -Filter *.xml -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}}
Weitere Variante die ebenfalls einwandfrei funktioniert ist es in die Bedingung des Where-Objects mit aufzunehmen (langsamer)
$pathes = $csv.Pfad | ?{Get-ChildItem $_ -File -Filter *.xml -EA SilentlyContinue | ?{$_.Extension -eq '.xml' -and $_.LastWriteTime -lt (get-date).AddMinutes(-10)}}  
You have the choice face-wink

Powershell Leitfaden für Anfänger
IT-Capitain
IT-Capitain 30.05.2022 um 17:37:14 Uhr
Goto Top
Ein kleines weiteres Update ist geplant und ich bin mir unsicher wie es klappen soll.

CSV Inhalt:
Path,Filetype
\\Pfad1\,*.xml
\\Pfad2\,*.txt

Ich dachte jetzt recht pragmatisch an folgendes, was aber leider nicht klappt.

$NagiosStatus = 0
$csv = Import-CSV  'Import.csv' -Delimiter ","  
$pathes = $csv.Path | ?{Get-ChildItem $_ -File -Filter **$csv.Filetype** -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}}
$NagiosStatus = @{$true=1;$false=0}[($pathes.Count -gt 0)]
colinardo
colinardo 30.05.2022 um 17:55:29 Uhr
Goto Top
$pathes = $csv | ?{Get-ChildItem $_.Path -File -Filter $_.Filetype -EA SilentlyContinue | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-10)}}