Frage zu einem cmd-Skript

Mr_Shadow

Newbie
Registriert
Dez. 2025
Beiträge
3
Hallo in die Runde,

ich habe mit der Hilfe der KI ein Skript erstellt, dass Ordner von einem Ausgangsordner in einen Zielordner übertragen soll. Dabei soll nach jedem zehnten Ordner ein neuer "Stapelordner" gebildet werden, der aus dem aktuellem Datum und einer fortlaufenden Nummer besteht. Soweit funktioniert alles nur wird zwar die GroupNumber nach dem 10.Ordner auf 2 erhöht, jedoch trotzdem kein neuer Zielordner mit "2025-12-17-2" generiert und alles weiterhin im ersten Stapel unter "2025-12-17-1" abgelegt. Hat jemand eine Idee, wo der Denkfehler ist?

Mir scheint das Problem in der Zeile:
:: Aktualisiere den groupFolder mit der neuen groupNumber
set groupFolder=%destinationFolder%\%dateFormatted%-%groupNumber%
zu liegen. Allerdings verstehe ich noch, wo das Problem liegt.

Für eine Hilfe wäre ich sehr dankbar.

Viele Grüße

Hier der gesamte Code:

Code:
@echo off
setlocal enabledelayedexpansion

:: Verzeichnisse festlegen
set sourceFolder=H:\Testowershell\Meine Ordner
set destinationRoot=H:\Testowershell\Neuer Ordner



:: Überprüfe, ob das Quellverzeichnis existiert
if not exist "%sourceFolder%" (
    echo Quellverzeichnis "%sourceFolder%" wurde nicht gefunden!
    pause
    exit /b
)

:: Datum des Antragstags extrahieren (für deutsches Format DD.MM.YYYY)
for /f "tokens=1-3 delims=." %%a in ('echo %date%') do (
    set day=%%a
    set month=%%b
    set year=%%c
)

:: Ersetze den Punkt mit Bindestrichen, um ungültige Zeichen im Dateipfad zu vermeiden
set dateFormatted=%year%-%month%-%day%

:: Zielordner für den Antragstag erstellen
set destinationFolder=%destinationRoot%\%dateFormatted%
if not exist "%destinationFolder%" mkdir "%destinationFolder%"

:: Ordner zählen und Stapeln
set counter=0
set groupNumber=1

:: Erstelle den ersten Stapelordner
set groupFolder=%destinationFolder%\%dateFormatted%-%groupNumber%
mkdir "%groupFolder%"

:: Zeige die Dateien im Quellordner an, um sicherzustellen, dass sie gefunden werden
echo Folgende Ordner werden verarbeitet:
dir "%sourceFolder%"

:: Ordner verschieben
for /d %%f in ("%sourceFolder%\*") do (
    :: Überprüfen, ob es sich um einen Ordner handelt
    if exist "%%f" (
        echo Verarbeite Ordner: %%f
        set /a counter+=1
        echo Zähler ist jetzt: !counter!

        :: Wenn der Zähler 10 überschreitet, erstelle einen neuen Stapel
        if !counter! geq 10 (
            echo Neuer Stapel erforderlich!

            :: Erhöhe die groupNumber und setze den Zähler zurück
            set /a groupNumber+=1
            set counter=1

            :: Zeige den Wert von groupNumber, um sicherzustellen, dass sie korrekt erhöht wurde
            echo Neuer groupNumber-Wert: !groupNumber!

            :: Aktualisiere den groupFolder mit der neuen groupNumber
            set groupFolder=%destinationFolder%\%dateFormatted%-%groupNumber%

            :: Überprüfe den Ordnerpfad
            echo Überprüfe, ob Ordner existiert: !groupFolder!

            :: Stelle sicher, dass der Ordner existiert
            if not exist "!groupFolder!" (
                echo Erstelle neuen Stapelordner: !groupFolder!
                mkdir "!groupFolder!"
            ) else (
                echo Der Stapelordner !groupFolder! existiert bereits!
            )
        )

        :: Zeige den Pfad des Ordners an, um sicherzustellen, dass er korrekt ist
        echo Verschiebe Ordner "%%f" nach "!groupFolder!"
        
        :: Ordner verschieben
        move "%%f" "!groupFolder!"
    )
)

echo -----------------------------------
echo Ordner wurden erfolgreich in Zehnerstapeln verschoben.
pause
 
Zuletzt bearbeitet:
Ja 🙂, da steckt ein klassischer Batch-Denkfehler mit Variablenexpansion drin – und du bist schon sehr nah dran.

Kurzfassung des eigentlichen Problems​

Der neue Stapelordner wird nicht korrekt neu gesetzt, weil du innerhalb der FOR-Schleife eine Variable mit %groupNumber% statt !groupNumber! zusammensetzt.

➡️ Dadurch bekommt groupFolder immer den alten Wert, auch wenn groupNumber korrekt erhöht wird.


Der Kernfehler im Detail​

Diese Zeile steht innerhalb der for-Schleife:

set groupFolder=%destinationFolder%\%dateFormatted%-%groupNumber%<br>

Warum das schiefgeht​

  • %groupNumber% wird einmal beim Parsen des Skripts aufgelöst
  • Zu diesem Zeitpunkt ist groupNumber=1
  • Alle späteren Änderungen (set /a groupNumber+=1) werden nicht mehr berücksichtigt
Du hast zwar Delayed Expansion aktiviert, nutzt sie hier aber nicht.


✅ Die richtige Lösung​

Du musst Delayed Expansion (!) verwenden:

set groupFolder=%destinationFolder%\%dateFormatted%-!groupNumber!<br>
👉 Das ist der entscheidende Fix.


Zweiter (logischer) Fehler:​

Aktuell hast du:

if !counter! geq 10 (<br>
Das bewirkt:

  • Ab Ordner 10, 11, 12, … wird jedes Mal ein neuer Stapel erzeugt
  • Du fängst das zwar teilweise ab, sauberer ist aber:
if !counter! equ 10 (<br>
Denn:

  • Nach dem 10. Ordner → neuer Stapel
  • counter wird zurückgesetzt → nächste Gruppe zählt wieder sauber bis 10

🔧 Korrigierter relevanter Block​

set /a counter+=1<br><br>if !counter! equ 10 (<br> set /a groupNumber+=1<br> set counter=0<br><br> set groupFolder=%destinationFolder%\%dateFormatted%-!groupNumber!<br><br> if not exist "!groupFolder!" (<br> mkdir "!groupFolder!"<br> )<br>)<br>

Warum dein Debugging trotzdem „gut aussah“​

Du hast richtig beobachtet:

  • groupNumber wird korrekt erhöht ✔
  • echo Neuer groupNumber-Wert: !groupNumber! zeigt den richtigen Wert ✔
👉 Aber:
groupFolder wurde mit alter Expansion gebaut → deshalb landet alles weiter in …-1.


Merksatz für Batch​

Innerhalb von Klammern (for / if) gilt:

  • %VAR% → alter Wert
  • !VAR! → aktueller Wert

Wenn du möchtest, kann ich dir:

  • eine aufgeräumte Endversion des Skripts posten
  • oder das Ganze als PowerShell-Variante deutlich robuster umsetzen
Sag einfach Bescheid 👍

Das sagt Chatty dazu. man muss wohl Delayed Expansion verwenden
 
  • Gefällt mir
Reaktionen: BeBur
Servus.

Der konkrete Fehler ist ein klassischer CMD/BAT-Fallstrick: Variablen mit %…% werden innerhalb von Klammerblöcken (...) bereits beim Parsen des Blocks expandiert (also “vorab”), nicht erst zur Laufzeit. Du hast zwar enabledelayedexpansion, nutzt bei der kritischen Stelle aber trotzdem %groupNumber%. Dadurch bleibt der Ausdruck faktisch auf dem alten Wert hängen.

%groupNumber% wird einmalig beim Einlesen des gesamten Blocks ersetzt (typisch mit 1). Später erhöhst du groupNumber, aber diese Zeile “sieht” das nicht mehr, weil sie nicht dynamisch neu expandiert wird.

Lösung: In Klammerblöcken für Werte, die sich ändern, !…! nutzen!

Zweitens erhöhst du counter und prüfst dann if !counter! geq 10. Das bedeutet: der 10. Ordner landet schon im neuen Stapel, weil du in der IF-Klammer counter=1 setzt und groupFolder umstellst, bevor du move ausführst.

Wenn “nach jedem zehnten Ordner” gemeint ist: Ordner 1–10 in Stapel 1, 11–20 in Stapel 2, …, dann muss die Bedingung gtr 10 sein (neuer Stapel erst beim 11.).

Ich würde aber bei sowas an deiner Stelle wegen der saubereren Datums-/Pfadbehandlung, stabilerer Schleifenlogik, einfacher Gruppierung etc. mit PowerShell arbeiten.
Das ist aus meiner Sicht angenehmer.

Frag mal deine „K.I.“ nach einer entsprechenden Lösung.
Habe jetzt nicht unbedingt Zeit das Skript zusammenzustellen.

Edit: … nur Zweiter :D
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: areiland
Kannst du bei Abbruch des Programs den neuen Wert von "groupFolder" prüfen? Der sollte den kompletten Pfad enthalten. Angelegt wird der Ordner aber nur, wenn der folgende Part auch erfüllt ist, durch "mkdir "!groupfolder!". Falls er existiert, meldet sich das Programm ja. Also scheint er nicht zu existieren, aber wird auch nicht erstellt. Versuche mal das mkdir "!groupFolder!"manuell auszuführen, vielleicht gibt es da Probleme mit der Variable, bei der Verwendung von ! und ".

:: Stelle sicher, dass der Ordner existiert
if not exist "!groupFolder!" (
echo Erstelle neuen Stapelordner: !groupFolder!
mkdir "!groupFolder!"
) else (
echo Der Stapelordner !groupFolder! existiert bereits!
)
)
 
Vielen herzlichen Dank für eure schnelle Antworten. Jetzt funktioniert es. Bin nur betrübt, dass meine KI nicht erkannt hat, dass es !.....! sein muss.

Viele Grüße
Matthias Ludwig
 
  • Gefällt mir
Reaktionen: =dantE= und twx24
Mr_Shadow schrieb:
Vielen herzlichen Dank für eure schnelle Antworten. Jetzt funktioniert es. Bin nur betrübt, dass meine KI nicht erkannt hat, dass es !.....! sein muss.
Beim Vibe-Coding gilt es, den Code lesen zu können, verstehen zu können, gegebenenfalls korrigieren zu können und erst dann auf die Menschheit loszulassen. Alles andere ist grob fahrlässig. KI ersetzt nicht NI, wird leider allzu oft vergessen.
 
  • Gefällt mir
Reaktionen: User38, kali-hi, JP-M und eine weitere Person
+1 für den Tipp zu Powershell für solche Automatisierungen
 
  • Gefällt mir
Reaktionen: Mystery1988, BeBur und =dantE=
Grundsätzlich hätte ich auch Powershell genommen. Leider scheint es hier auf dem System (es handelt sich um eine Automatisierung für eine berufliche Tätigkeit) Powershell deaktiviert zu sein. Zumindest kam die Meldung das es auf meinem System deaktiert wurde.

@Dat IT Nerd: Ich verstehe deinen Punkt. Ich kann aufgrund meiner Ausbildung von vor 20 Jahren in groben Zügen schon Skriptsprachen lesen und verstehen. Aber zumindest diese Automatisierung in einer Batch-Daei war mir neu und die KI war dabei eine Hilfe für mich.
 
  • Gefällt mir
Reaktionen: twx24
In 20 Jahren hat sich viel getan und gerade deshalb darf man der KI als Anfänger nicht blind vertrauen... Nimm als anderes Beispiel zum Beispiel Zeitungsartikel... inzwischen baut die KI schon in den Artikelüberschriften Rechtschreibfehler ein... das gab es vor drei Jahren noch nicht.
 
Mr_Shadow schrieb:
Zumindest kam die Meldung das es auf meinem System deaktiert wurde.
Das ist nicht unüblich für bestimmte Nutzergruppen im beruflichen Umfeld.

Ich nahm aufgrund der Aufgabenstellung einfach an, du hättest im Bedarfsfall durchaus erweiterte Rechte auf dem System.

Schlussendlich funktioniert das ganze ja jetzt.

Ich würde dir jedoch empfehlen, zukünftig die interne IT Administration und deine Leitung bei derartigen Ansätzen mit einzubeziehen. Es handelt sich ja anscheinend um eine durchaus brauchbare Lösung für ein bekanntes Problem. Das sollte publiziert werden.

Gutes Gelingen!
 
Zurück
Oben