
141986
23.06.2022
PS: Überwache Ordner- Script
Hallo Admins,
ein Kollege arbeitet an einer Messmaschine, diese gibt aber lt. Kollegen kein Feedback wenn die automatische Berechnung abgeschlossen ist.
Einzig eine Textfile wird Zentral abgelegt.
Nun rennt der Kollege regelmäßig (sinnlos) zum Rechner und guckt, ob eine neue Textfile im shared folder liegt, wenn nein: kommt Er in 10 Minuten wieder.
Hier bat Er mich um Hilfe: es soll ein kleines Tool sein, welches eine Nachricht ausgibt, wenn eine neue Datei im Ordner XY liegt.
Das habe ich soweit auch zusammengeklickt bekommen via Powershell.
Nun ist es so, dass das zwar (weniger hübsch) funktioniert, aber sobald eine File erstellt wurde und die MSGBox aufgeht, verarbeitet das Script keine weiteren neu erstellten Files mehr bzw. schreibt es zwar in die Console, öffnet aber keine weiteren Msgboxen mehr (im Fall, dass mehrere Berechnungen abgeschlossen wurden).
Ebenso würde ich gerne um Optimierung des Codes bitten - ich bin kein hauptberuflicher Entwickler, daher Qualität von unter null. -Schlecht fühle ich mich deswegen aber nicht
Rahmenbedingungen: keine Adminrechte am Rechner, AV installiert, Win10.
Freue mich auf euer Feedback.
Besten Dank und viele Grüße
/65k
ein Kollege arbeitet an einer Messmaschine, diese gibt aber lt. Kollegen kein Feedback wenn die automatische Berechnung abgeschlossen ist.
Einzig eine Textfile wird Zentral abgelegt.
Nun rennt der Kollege regelmäßig (sinnlos) zum Rechner und guckt, ob eine neue Textfile im shared folder liegt, wenn nein: kommt Er in 10 Minuten wieder.
Hier bat Er mich um Hilfe: es soll ein kleines Tool sein, welches eine Nachricht ausgibt, wenn eine neue Datei im Ordner XY liegt.
Das habe ich soweit auch zusammengeklickt bekommen via Powershell.
Nun ist es so, dass das zwar (weniger hübsch) funktioniert, aber sobald eine File erstellt wurde und die MSGBox aufgeht, verarbeitet das Script keine weiteren neu erstellten Files mehr bzw. schreibt es zwar in die Console, öffnet aber keine weiteren Msgboxen mehr (im Fall, dass mehrere Berechnungen abgeschlossen wurden).
Ebenso würde ich gerne um Optimierung des Codes bitten - ich bin kein hauptberuflicher Entwickler, daher Qualität von unter null. -Schlecht fühle ich mich deswegen aber nicht
Rahmenbedingungen: keine Adminrechte am Rechner, AV installiert, Win10.
$Path = 'C:\service\Test\'
$FileFilter = '*.txt'
$IncludeSubfolders = $false
$AttributeFilter = [IO.NotifyFilters]::FileName, [IO.NotifyFilters]::LastWrite
$ChangeTypes = [System.IO.WatcherChangeTypes]::Created
$Timeout = 100
function Invoke-SomeAction
{
param
(
[Parameter(Mandatory)]
[System.IO.WaitForChangedResult]
$ChangeInformation
)
Write-Host ""
Write-Host "== Aenderung im Ordner $Path festgestellt ==" -ForegroundColor Red
Write-Host ""
$ChangeInformation | Out-String | Write-Host -ForegroundColor Green
Add-Type -AssemblyName PresentationCore,PresentationFramework
$msgBody = "Neue Maschinendaten in $Path gefunden."
$msgTitle = "LOS ARBEITE!"
$msgButton = 'OK'
$msgImage = 'Question'
$Result = [System.Windows.MessageBox]::Show($msgBody,$msgTitle,$msgButton,$msgImage)
}
try
{
Write-Warning "Folgender Ordner wird ueberwacht: $Path"
$watcher = New-Object -TypeName IO.FileSystemWatcher -ArgumentList $Path, $FileFilter -Property @{
IncludeSubdirectories = $IncludeSubfolders
NotifyFilter = $AttributeFilter
}
Unregister-Event -SourceIdentifier FileCreated -EA 0
Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$fullname = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "Neue Maschinendaten wurden gefunden ('$fullname' erstellt um: $timeStamp)" -F green
Out-File -FilePath "C:\service\test\test.log" -Append -InputObject "Neue Maschinendaten wurden gefunden ('$fullname' erstellt um: $timeStamp)"
# $MyEmail = "mymail@gmail.com"
# $SMTP= "smtp.gmail.com"
# $To = "mymail@gmail.com"
# $Subject = "PRINT HOTFOLDER HIT"
# $Body = "PRINT HOTFOLDER HIT"
# $Creds = (Get-Credential -Credential "$MyEmail")
# Send-MailMessage -To $to -From $MyEmail -Subject $Subject -Body $Body -SmtpServer $SMTP -Credential $Creds -UseSsl -Port 587 -DeliveryNotificationOption never
}
do
{
$result = $watcher.WaitForChanged($ChangeTypes, $Timeout)
if ($result.TimedOut) { continue }
Invoke-SomeAction -Change $result
} while ($true)
}
finally
{
$watcher.Dispose()
Write-Warning 'Speicher freigeben und Programm beenden...'
}
Freue mich auf euer Feedback.
Besten Dank und viele Grüße
/65k
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3151902437
Url: https://administrator.de/forum/ps-ueberwache-ordner-script-3151902437.html
Ausgedruckt am: 13.05.2025 um 13:05 Uhr
5 Kommentare
Neuester Kommentar
Moin,
warum ersetzt du deine Zeilen 23-27 nicht durch deine Zeilen 49-56 (*)?
Gruß
em-pie
warum ersetzt du deine Zeilen 23-27 nicht durch deine Zeilen 49-56 (*)?
Gruß
em-pie
- Nutze besser das .Net MailKit
gute Frage. Der Gedanke war: einmal ins Logfile schreiben, einmal eine Messagebox zu triggern und eben in die Console.
Verstehe..stecke noch nicht so tief in der Powershell, aber im aller schlimmsten Fall ein zweites Script erstellen "msgbox.ps1", welches NUR die Messagebox darstellt. Als Parameter gibst du den anzuzeigenden Text mit.
Im Hauptscript dann das Script in einer neuen powershell.exe-Instanz öffnen.
Bzgl. E-Mail
Send-MailMessage geht auch - ich nutze das auch noch weiterhin. Die Anforderungen an den internen Mail-Server sind (noch) nicht so hoch, dass das auch damit geht.

Ersetze deine Zeile 27 mit:
Dann wird die Messagebox als Job ausgeführt und dein Hauptscript kann weiterarbeiten.
$job = Start-Job -ScriptBlock {
Add-Type -AssemblyName System.Windows.Forms
$message = [System.Windows.Forms.MessageBox]::Show("$using:msgBody" , "$using:msgTitle" , $using:msgButton, $using:msgImage )
}
Dann wird die Messagebox als Job ausgeführt und dein Hauptscript kann weiterarbeiten.