Batch Ordnerüberwachung

Status
Für weitere Antworten geschlossen.
Ich gebe mich geschlagen. Ich komm nicht drauf. Ich habe alle mir erdenklichen Kombinationen durchprobiert.
Der letzte Stand ist folgender:

Code:
@Echo off
: loop
@Echo off
set   bool=false

if    exist "Photoalbum\pic1" if exist "Photoalbum\pic2" if exist "Photoalbum\pic3" (set bool=false)
if    "%bool%" == "false" (echo Es sind nicht mehr alle Bilder vollständig vorhanden.
      timeout /t 1)
      goto loop

else  (
      timeout /t 5
      shutdown /r /f /o /t 0)
)

Mit dem else Befehl stimmt übrigens was nicht! Aber was Powershell daran nicht gefällt... Gemini gibt mir auch keine Antwort.
 
Eine ordentliche Backup Strategie inklusive Air gap und du brauchst deine Paranoia nicht weiter pflegen
 
  • Gefällt mir
Reaktionen: iSight2TheBlind, nutrix, cruse und 3 andere
PowerShell schreibt der else Befehl ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Ergänzung ()

Micha- schrieb:
Eine ordentliche Backup Strategie inklusive Air gap und du brauchst deine Paranoia nicht weiter pflegen
Ja, da ist was dran. Zumal man selten einen Angriff zu 100 % abwehren kann und du weißt ja nie welche Daten dran glauben müssen.
Ergänzung ()

Ok, die Else ist Geschichte. Habe das Problem lösen können.

Code:
) else (
       timeout /t 5
       shutdown /r /f /o /t 0)
)
Ergänzung ()

JennyCB schrieb:
sorry, hast recht

Code:
set bool=false
if exist "Photoalbum\pic1" if exist "Photoalbum\pic2" if exist "Photoalbum\pic3" (set bool=true)
if "%bool%" == "true" (echo Alle Bilder sind noch vollständig vorhanden.
      timeout /t 5)
else (echo Es sind nicht mehr alle Bilder vollständig vorhanden.
      timeout /t 5
      exit /FolderGuard3)
Ergänzung ()

Und manche können es noch ohne KI. Fertigkeiten verlieren ist aber ein anderes Thema.

Der erste Part ist auch schon logisch falsch, weil er zu widersprüchlichen Aussagen führt.
Alle Bilder sind noch vollständig vorhanden.
PowerShell meldet aber: "Es sind nicht mehr alle Bilder vollstaendig vorhanden."
 
Zuletzt bearbeitet:
Habe das jetzt mal hier local getestet. Funktioniert.
Code:
@echo off
set bool=false 
if exist "D:\pic1" if exist "D:\pic2" if exist "D:\pic3" (set bool=true)
if "%bool%" == "true" (echo Alle Bilder sind noch vollstaendig vorhanden.) else (echo Es sind nicht mehr alle Bilder vollstaendig vorhanden.)

Musste nun extra für dich von Linux nach Windows 11 booten.
 
Zuletzt bearbeitet:
Es reicht, wenn nur 1 Datei nicht mehr vorhanden ist, dann sind nicht mehr ALLE Dateien vorhanden. Der Ordner bildet ja nur eine Teilmenge! Natürlich kann es auch sein, dass der ganze Ordner nicht mehr vorhanden ist. Ja, in dem Fall wären dann auch nicht mehr alle Dateien vorhanden.
 
Eine mindestens Pro Edition von Windows (Damit der Group Policy Editor verfuegbar ist), kann das auch ohne das man scripten muss.

Dazu gibt es Details hier, wie man Events ausloesen kann wenn in einem bestimmten Ordner was geaendert wird. Man kann da ziemlich detailliert werden:
https://www.blumira.com/blog/detecting-windows-server-file-changes

Und dann, wenn du bestaetigt hast dass das Event abgefeuert wird, kannst du in der Ereignisanzeige einen Rechtsklick auf das Event machen und einen Task an das Event haengen, worin dann wiederrum der Rechnerneustart ausgeloest wird.
 
  • Gefällt mir
Reaktionen: Feta und Redundanz
Du brauchst einen System.IO.FileSystemWatcher und Register-ObjectEvent.

MonitorDirectory.ps1:

PowerShell:
param(
    [Parameter(Mandatory=$false)]
    [string]$Path = ".",

    [Parameter(Mandatory=$false)]
    [string]$Filter = "*",

    [Parameter(Mandatory=$false)]
    [switch]$IncludeSubdirectories,

    [Parameter(Mandatory=$false)]
    [string]$LogFile = "$env:TEMP\DirectoryMonitor.log"
)

# Prüfen ob Pfad existiert
if (-not (Test-Path -Path $Path)) {
    Write-Error "Pfad '$Path' existiert nicht."
    exit 1
}

# FileSystemWatcher anlegen
$watcher = New-Object System.IO.FileSystemWatcher -ArgumentList $Path, $Filter
$watcher.IncludeSubdirectories = $IncludeSubdirectories.IsPresent
$watcher.EnableRaisingEvents = $true

# Hilfs-Action für Created/Changed/Deleted
$commonAction = {
    $time = Get-Date -Format "s"
    $changeType = $Event.SourceEventArgs.ChangeType
    $fullPath = $Event.SourceEventArgs.FullPath
    $msg = "$time`t$changeType`t$fullPath"
    Write-Host $msg
    if ($using:LogFile) {
        $msg | Out-File -FilePath $using:LogFile -Append -Encoding UTF8
    }
}

# Separate Action für Renamed (enthält alte und neue Pfade)
$renamedAction = {
    $time = Get-Date -Format "s"
    $r = $Event.SourceEventArgs
    $msg = "$time`tRenamed`t$($r.OldFullPath) -> $($r.FullPath)"
    Write-Host $msg
    if ($using:LogFile) {
        $msg | Out-File -FilePath $using:LogFile -Append -Encoding UTF8
    }
}

# Events registrieren und Referenzen sammeln
$subs = @()
$subs += Register-ObjectEvent -InputObject $watcher -EventName Created -SourceIdentifier FileCreated -Action $commonAction
$subs += Register-ObjectEvent -InputObject $watcher -EventName Changed -SourceIdentifier FileChanged -Action $commonAction
$subs += Register-ObjectEvent -InputObject $watcher -EventName Deleted -SourceIdentifier FileDeleted -Action $commonAction
$subs += Register-ObjectEvent -InputObject $watcher -EventName Renamed -SourceIdentifier FileRenamed -Action $renamedAction

Write-Host "Überwache '$Path' (Filter: '$Filter')" -ForegroundColor Green
if ($IncludeSubdirectories.IsPresent) { Write-Host " => Unterverzeichnisse eingeschlossen" }
Write-Host "Logfile: $LogFile"
Write-Host "Zum Beenden Strg+C drücken..."

try {
    while ($true) { Start-Sleep -Seconds 1 }  # Endlosschleife, damit Events verarbeitet werden
}
finally {
    Write-Host "Beende Überwachung..." -ForegroundColor Yellow
    foreach ($s in $subs) {
        Unregister-Event -SubscriptionId $s.SubscriptionId -Force -ErrorAction SilentlyContinue
    }
    $watcher.EnableRaisingEvents = $false
    $watcher.Dispose()
    Write-Host "Fertig."
}

In die Action-Blöcke kommt dann zum Schluss, was dann bei einer Änderung passieren soll...

Irrtümer vorbehalten. ;)

Ich denke aber auch, hier könnte schlicht ein XY-Problem vorliegen...
 
  • Gefällt mir
Reaktionen: Feta, JackForceOne, tollertyp und eine weitere Person
Ich habe es nochmal, diesmal mit vereinfachten Bildnamen ausprobiert. Alle Bilder sind noch vollständig vorhanden. PowerShell schreibt: "Es sind nicht mehr alle Bilder vollstaendig vorhanden."

Code:
@Echo off
set    Photoalbum=C:\Users\mhamb\Desktop\Photoalbum
set    bool=false
 
if     exist "Photoalbum\pic1.jpg" if exist "Photoalbum\pic2.jpg" if exist "Photoalbum\pic3.jpg" (set bool=true)
if     "%bool%" == "true" (echo Alle Bilder sind noch vollstaendig vorhanden.
       timeout /t 5

) else (  
       echo Es sind nicht mehr alle Bilder vollstaendig vorhanden.
       timeout /t 5
       exit /FolderGuard4)
 
Zuletzt bearbeitet:
set Photoalbum=C:\Users\mhamb\Desktop\Photoalbum und "Photoalbum\pic1.jpg" passt nicht daher ist die Meldung "Es sind nicht mehr alle Bilder vollstaendig vorhanden." korrekt.

Code:
set Photoalbum="C:\Users\mhamb\Desktop\Photoalbum"
set bool=false
if exist "%Photoalbum%\pic1" if exist "%Photoalbum%\pic2" if exist "%Photoalbum%\pic3" (set bool=true)
if "%bool%" == "true" (echo Alle Bilder sind noch vollstaendig vorhanden.) else (echo Es sind nicht mehr alle Bilder vollstaendig vorhanden.)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: areiland
Eben, es muss bei der Dateiprüfung %Photoalbum% geschrieben werden, damit die Variable auch ausgewertet werden kann.
 
  • Gefällt mir
Reaktionen: nutrix und JennyCB
Und bist du sicher, dass ein Verschlüsselung trojaner die Dateien LÖSCHT?
 
  • Gefällt mir
Reaktionen: nutrix
JennyCB schrieb:
Schwierige Geburt aber ok, der Junge will wohl noch lernen.

Wahnsinn! Und das erzählst Du mir drei Stunden später?!
Das hat mir übrigens vor 15 min Gemini auch gesagt.
 
War das jetzt ein Dankeschön oder weil ich meine Zeit sinnlos verplempert habe?
Habe neben CB echt noch ein reales Leben so nebenbei.
"3 Stunden später", alles klar. (50 Minuten waren es)
Das werden noch harte Zeiten werden mit den KI-Jüngern.
Ich habe das hier schon familiär mit meinem Bruder. Völlig uneinsichtig wegen KI.
Besserwisser hoch drei werden da gezüchtet. Von Materie aber null Ahnung.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Fusionator, nutrix, Bob.Sponge und 2 andere
JennyCB schrieb:
"3 Stunden später", alles klar. (50 Minuten waren es)

Nun ja, es waren gefühlte drei Stunden später :rolleyes:. Der wertvollste Tipp war, dass Batch keine Oder Verknüpfungen kennt. Es müssen alle ifs wahr sein, wenn man die Variable truthen will. Das kann man nur mit boolscher Gewalt.
Ich hab` was gelernt, insoweit bin ich Dir natürlich dankbar.
Ergänzung ()

Ich habe die Lösung gefunden. Heureka :cool_alt:! 1000 Jahre später :hammer_alt:.

Code:
@echo off
set    Photoalbum=C:\Users\mhamb\Desktop\Photoalbum
set    bool=false

if     exist %Photoalbum%\pic1.jpg if exist %Photoalbum%\pic2.jpg if exist %Photoalbum%\pic3.jpg (set bool=true)
       if "%bool%" == "true" (echo Alle Bilder sind noch vollstaendig vorhanden.)
       if "%bool%" == "true" (timeout /t 5)
       if "%bool%" == "true" (goto loop)

) else (
       echo Es sind nicht mehr alle Bilder vollstaendig vorhanden.
       timeout /t 5
       exit /FolderGuard)

: loop
       @Echo off
set    bool=false

if     exist %Photoalbum%\pic1.jpg if exist %Photoalbum%\pic2.jpg if exist %Photoalbum%\pic3.jpg (set bool=true)
       timeout /t 1
       if "%bool%" == "true" (goto loop)

) else (
       shutdown /r /f /o /t 0

:n8:
 
Zuletzt bearbeitet:
Micha- schrieb:
Und bist du sicher, dass ein Verschlüsselung trojaner die Dateien LÖSCHT?
Ja. Ransomware kopiert erst die File und verschlüsselt sie anschließend. Danach löscht Ransomware das Original samt Volumenschatten unwiederbringlich (erase).
Das was übrigbleibt sind nur Kopien.
Mein Skript würde so aber auch reagieren (ohne löschen). Die File wurde ja verändert und hat eine neue Dateinamenerweiterung bekommen, d.h. der Pfad stimmt nicht mehr vollständig.
 
Dann gehen auf ja ziemlich auffällig vor. Immerhin stellt das sicher, dass Datei basierte Backups nicht mit den verschlüsselten Dateien überschrieben werden. Dann ist das Verlust Risiko doch recht gering.
 
@Micha- Ransomware arbeitet wahnsinnig schnell. Für 1 GB Daten braucht die neueste Version etwa 5 min. Es hängt aber auch von den Systemressourcen meines Rechners ab. Wenn plötzlich dein RAM in die Knie gehen sollte - ohne dass du große Anwendungen geöffnet hast, kann das ein Anzeichen für einen Ransomware Angriff sein. Ins Internet kommst du dann übrigens auch nicht mehr. Wenn du da sofort den Stecker ziehst, dann ziehst du der Ransomware auch den Zahn. Du darfst aber dann nicht mehr normal booten. Dafür habe ich Desinfec't, den Rettungsstick mit Antivirus (aktualisiert auch seine Virusdatenbanken).
 
Genau deshalb hat man immer Backups seiner Daten auf Datenträgern, die nach der Sicherung vom Rechner entfernt werden. Alles andere ist Kindergarten - denn bis Dein Script auf sowas reagiert, kann eine Ransomware schon den gesamten retlichen Datenbestand verschlüsselt haben.
 
areiland schrieb:
denn bis Dein Script auf sowas reagiert, kann eine Ransomware schon den gesamten retlichen Datenbestand verschlüsselt haben
Ich verstehe die abstrakte Gefahr auch gar nicht. Wer sollte so etwas tun?

Da sind Updates und Backups wichtiger - anstatt das System einfach ungeordnet herunterzufahren.
 
  • Gefällt mir
Reaktionen: areiland
Status
Für weitere Antworten geschlossen.
Zurück
Oben