141986
Goto Top

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 face-smile

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

Content-Key: 3151902437

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

Printed on: April 25, 2024 at 10:04 o'clock

Member: em-pie
em-pie Jun 23, 2022 at 07:43:17 (UTC)
Goto Top
Moin,

warum ersetzt du deine Zeilen 23-27 nicht durch deine Zeilen 49-56 (*)?

Gruß
em-pie


  • Nutze besser das .Net MailKit
https://adamtheautomator.com/powershell-email/
Mitglied: 141986
141986 Jun 23, 2022 updated at 07:48:06 (UTC)
Goto Top
hey em-pie,

gute Frage. Der Gedanke war: einmal ins Logfile schreiben, einmal eine Messagebox zu triggern und eben in die Console.

Nutze besser das .Net MailKit
Öhh, muss ich mich einlesen, danke Dir face-smile

VG

Edit:
Via Mail senden ist aktuell nicht das Thema. Primär geht es mir erst einmal um einen vernünftigen Code und eben, dass nach Möglichkeit, das Script weiter rennt und weitere Messageboxen malt sofern neue File im Ordner gefunden wurde.

Edit²:
Install-Package -Name 'MailKit' -Source 'nuget.org'
Ich bin mir nicht sicher, ob der Kollege etwas installieren kann ohne Adminrechte auf seiner Möhre.
Member: em-pie
em-pie Jun 23, 2022 updated at 08:41:50 (UTC)
Goto Top
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.
Mitglied: 3063370895
Solution 3063370895 Jun 23, 2022 updated at 09:02:25 (UTC)
Goto Top
Ersetze deine Zeile 27 mit:

$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.
Mitglied: 141986
141986 Jun 23, 2022 at 09:22:55 (UTC)
Goto Top
Send-MailMessage geht auch
Mein Gedanke war, sollte es gewünscht werden, dass ich mich an Outlook ranhänge (ist installiert auf der Kiste) und darüber Mails versende. Das ist allerdings aktuell nicht notwendig. Ich schätze, der Kollege wird froh sein, dass man Ihm einige Kilometer Laufweg erspart face-smile

Danke dafür!

Dann wird die Messagebox als Job ausgeführt und dein Hauptscript kann weiterarbeiten.
Hey chaot1coz,
mega - danke Dir! face-smile

Weitere Vorschläge oder Ideen sind super gern gewünscht face-smile

Danke Euch!

VG