Batch Ordnerüberwachung

Status
Für weitere Antworten geschlossen.

dos78

Ensign
Registriert
Okt. 2025
Beiträge
190
Hallo!
Ich habe ein Batch Skript verfasst. Ich will einen Ordner auf Veränderungen überwachen. Wenn eine Datei verändert oder gelöscht wird, soll mein Rechner sofort ohne Umwege in den erweiterten Modus booten. Das Skript funktioniert, wenn ich nur eine einzelne Datei/Ordner überwachen will:

Code:
[USER=116181]@Echo[/USER] off

if exist "C:\Users\mhamb\Desktop\Photoalbum" (

   echo Photoalbum ist noch vorhanden.

   timeout /t 5

 

) else (

   echo Photoalbum ist nicht mehr vorhanden.

   timeout /t 5

   exit /FolderGuard

)



[USER=116181]@Echo[/USER] off

: loop

[USER=116181]@Echo[/USER] off

if exist "C:\Users\mhamb\Desktop\Photoalbum" (

   timeout /t 1

   goto loop



) else (

   shutdown /r /f /o /t 0

  )

)

Das Skript funktioniert aber nicht, wenn ich den Ordnerinhalt, also alle im Ordner befindlichen Dateien überwachen will:

Code:
[USER=116181]@Echo[/USER] off

set Photoalbum=C:\Users\mhamb\Desktop\Photoalbum

set fine-art-of-history-gallery._=pic



if exist "Photoalbum\pic1"  (

if exist "Photoalbum\pic2"  (

if exist "Photoalbum\pic3"  (



   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

)





[USER=116181]@Echo[/USER] off

: loop

[USER=116181]@Echo[/USER] off

if exist "Photoalbum\pic1"  (

if exist "Photoalbum\pic2"  (

if exist "Photoalbum\pic3"  (

   timeout /t 1

   goto loop



)  else (

   shutdown /r /f /o /t 0

  )

)

Wo liegt der Fehler?
Sind die Variablen richtig gesetzt?
Eine for Schleife wäre Quatsch, dann können ja keine Dateien gelöscht werden, weil dann alle Dateien in einer offenen Anwendung (PowerShell) laufen würden. Das hat wohl damit zu tun, dass eine for Schleife den gesamten Ordnerinhalt überwacht. Mir reicht es aber wenn PowerShell einfach nur Datei für Datei durchscannt (also goto Schleife).

Wer kann mir helfen?
 
Zuletzt bearbeitet:
Ohne zu recherchieren und das Skript vollständig zu verstehen, sehe ich im zweiten Skript zweimal jeweils drei IF-Schleifen, die jeweils nur einmal geschlossen werden (IF-THEN-ELSE-END, oder so ähnlich). D.h. du musst im zweiten Teil nach den IF Zeilen noch mit jeweils 2 Mal else (shutdown /r /f /o /t 0) die offenen Schleifen schließen. Oder ich habe einen Denkfehler, kann ich nicht ausschließen.
 
Bash:
@Echo off
set Photoalbum=C:\Users\mhamb\Desktop\Photoalbum
set fine-art-of-history-gallery._=pic

if exist "Photoalbum\pic1" (
  if exist "Photoalbum\pic2" (
    if exist "Photoalbum\pic3" (
      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
    )


@Echo off
: loop
@Echo off
if exist "Photoalbum\pic1" (
  if exist "Photoalbum\pic2" (
    if exist "Photoalbum\pic3" (
      timeout /t 1
      goto loop
    ) else (
      shutdown /r /f /o /t 0
    )
  )

Bitte nutze die Code Tags hier im Forum. Das macht die Sache leserlich und es fällt sofort auf, dass Klammern fehlen.

[CODE=bash]...[/CODE]

Hinzu kommt, dass deine verschachtelten if-Bedingungen (nicht Schleifen! ;)) nur weiterlaufen, wenn jeweils die vorgelagerte Bedingung erfüllt ist.

Wenn pic1 nicht existiert, wird nie geprüft, ob pic2 und 3 noch da sind.

Besserer Lösungsansatz: Packe dir die File Liste in eine Variable und iteriere anschließend alle x Sekunden über diese Liste.

Hilfe: https://stackoverflow.com/questions...es-into-a-variable-and-but-size-of-array-is-1
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Feta, tollertyp, Redundanz und 3 andere
Habe das Posting schnell mit dem Handy gemacht. Konnte das nicht codieren. Habe das jetzt am PC in Ruhe nachcodiert :).
 
Zuletzt bearbeitet:
Nicht spoilern, CODEBLOCK bitte.
1761312934404.png

Darf ich fragen, warum Du das so machen und haben willst? Ich sag nur mal XY Problem.
 
  • Gefällt mir
Reaktionen: piepenkorn, iSight2TheBlind, kuddlmuddl und 3 andere
Nicht Spoilern. Leserlich machen. Die entsprechenden Tags habe ich in meinem Beitrag ergänzt. Oder über das Menü:
1761312942046.png
 
  • Gefällt mir
Reaktionen: nutrix und Redundanz
Batch kann keine Oder-Verknüpfung. Musst du so in etwa ändern (ungeprüft)

Code:
set bool=false
if exist "Photoalbum\pic1" (set bool=true)
if exist "Photoalbum\pic2" (set bool=true)
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)
 
Zuletzt bearbeitet:
JennyCB schrieb:
Wird nicht funktionieren, da die Variable bool auch auf true gesetzt würde, wenn nur ein Ordner vorhanden ist. Da bräuchte man für jeden Ordner eine eigene Variable, die geprüft wird.
 
  • Gefällt mir
Reaktionen: cruse, JennyCB und areiland
Jedes halbwegs aktuelle Windows-System hat ne Powershell. Wenn es keine Powershell hat, würde ich es sowieso nicht mehr starten.
Ich starte PowerShell-Scripte immer als CMD-Datei, mit dem Header aus:
https://ftp.heise.de/ct/listings/2021/11/2111_152.zip
Der Artikel selbst ist leider hinter einer Paywall: https://www.heise.de/ratgeber/Windows-10-PowerShell-Skripte-als-Batch-verpacken-6043473.html

In der PowerShell lassen sich solche Sachen deutlich eleganter schreiben.

Ja, ich weiß, "ich habe aber keine Erfahrung mit PowerShell".
Das ist immer das beste Argument, um nichts neues zu lernen. Vor allem trägt das eigene Verhalten noch dem Argument unterstützend bei, wenn man sich nie damit beschäftigt, kann man keine Erfahrung gewinnen...
 
  • Gefällt mir
Reaktionen: pizza4ever, simpsonsfan und areiland
Wird nicht funktionieren, da die Variable bool auch auf true gesetzt würde, wenn nur ein Ordner vorhanden ist.
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.
 
Zuletzt bearbeitet:
Ich würde trotzdem erst mal gerne den Anwendungsfall wissen, warum man bei einer Dateiänderung neu starten will. Die veränderte oder gelöschte Datei dann unter Umständen ganz weg bzw. nicht mehr wieder herstellbar.
 
  • Gefällt mir
Reaktionen: kali-hi, Alter_Falter und simpsonsfan
@nutrix Das ganze ist als Gimmick gedacht. Ein Quasi-Tool gegen Ransomware. Das ganze würde im Ernstfall nichts nützen. Soviel weiß ich sogar ohne ChatGPC und Gemini.
Für den Ernstfall heißt meine Lebensversicherung Bitdefender Total Security. Ich mache aber auch immer zwei externe Backups mit Ashampoo Pro 25 (mit WindowsPE Rettungsstick).
Ich habe auch einen roten Knopf als Batch Datei auf dem Desktop "Emergency Reboot".

Code:
@echo off 
echo                        Forcing Reboot into advanced Startup Options...
timeout /t 5       
shutdown /r /f /o /t 0

Zusätzlich habe ich noch den Desinfec`t Rettungsstick 2025/26.
Ich habe Windows 11 mit Secure Boot. Da bin ich schon ganz gut mit aufgestellt, denk ich mal.
 
Diese Timeout Angabe in Zeile 3 ist unsinnig! Denn der Parameter /t bei Shutdown ist für exakt den gleichen Zweck gedacht.
 
  • Gefällt mir
Reaktionen: JennyCB
@areiland Das stimmt nicht! timeout /t 5 startet einen Countdown, den ich immer noch canceln (oder abkürzen) kann.
shutdown /r /f /o /t 5 ist eine reine Deadline, die kann ich nicht mehr beeinflussen kann. Der Point of no Return ist überschritten. Das ist der Unterschied. Oft sind`s diese Feinheiten :) ...
 
Zuletzt bearbeitet:
@JennyCB Ich weiß um die Gefährlichkeit von Ransomware. Ich habe schon einmal Lösegeld bezahlt (ich habe meine Daten tatsächlich komplett wiederbekommen). Ich habe aber daraus gelernt. Mein Sicherheitskonzept ist stark. Ich verstehe zwar nichts vom Programmieren, ich kann aber Tools konfigurieren und ich verstehe welche Tools ich brauche und was die können. Aber man braucht ein Konzept und man muss seine Schwachstellen kennen. Was kann Ransomware? Heute weiß ich`s. Das muss mir niemand erklären. Das ist die größte Gefahr überhaupt, das ist die digitale Atombome.
Die größte Schwachstelle ist folgende: Meine Backups könnten theoretisch auch schon kompromittiert sein (mein Rechner natürlich auch). Es ist sehr sehr unwahrscheinlich, aber möglich. Mein Bitdefender findet 99 % aller Malware. Gefühlt sogar 200 %. Der größte Feind der Ransomware ist noch Stecker raus - Hard Shutdown. Ransomware wird eher am Verhalten erkannt, eher und schneller. Das kann nur eine KI bieten. Signatur basierte Scans sind ineffektiv.
Ergänzung ()

Ich muss mit dem set bool=false kapitulieren. Das verstehe ich nicht wofür das gut ist.

Code:
@Echo off
: loop
@Echo off
if exist "Photoalbum\pic1" (
  if exist "Photoalbum\pic2" (
    if exist "Photoalbum\pic3" (
      timeout /t 1
      goto loop
    ) else (
      shutdown /r /f /o /t 0
    )
  )

Ist der Hinterteil denn wenigstens richtig? Oder muss da auch bool false true rein?
 
Zuletzt bearbeitet:
"set bool=false wird in verschiedenen Programmiersprachen verwendet, um eine boolesche Variable namens bool auf den Wert false zu setzen, was in der Regel den Zustand "unwahr" oder "aus" repräsentiert."
Das schreibt Gemini. Damit kann ich nichts anfangen. Ich verstehe den praktischen Verwendungszweck nicht.
 
Das kommt aus der Programmierung.
Setze erst einmal das Ergebnis auf falsch.
Danach schaust du nach Ereignissen die wahr sein könnten.
Das ist ein Programmierstil um Fehler zu vermeiden.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben