myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Verzeichnis-/Unterverzeichnis-Generator die Zweite (https://mygully.com/showthread.php?t=8218700)

ET23 05.05.25 14:15

Verzeichnis-/Unterverzeichnis-Generator die Zweite
 
Schafft es jemand, die bei mir ca.wöchentl., händische Zusammenräumaktion mittels einem BatchS***** zu vereinfachen ? :cry::cry:
In einem Hauptordner fallen jeden Tag versch.Unterordner mit Dateien etc. an.
Wunsch: Batch/Programm sollte alle Ordner (samt Inhalt) entspr. des Entstehungsdatums in einem gemeinsamen Ordner verschieben dh.
alle Ordner, die z.B. am 19.04.2025 entstanden sind werden in den neuen Ordner "19.04.2025" verschoben etc..
Beim Verschieben sollte/muß aber das ersprechende Entstehungsdatum erhalten bleiben.

Bitte, kann mir ein Profi da behilflich sein & schafft jemand das ?
ET23 :(:T

Mr_Braun 05.05.25 19:06

Das kriegt heutzutage jeder mit KI hin.

Zitat:

Ich möchte ein PowerShell-Skript.

In einem Hauptordner fallen jeden Tag versch.Unterordner mit Dateien etc. an.
Das Skript ollte alle Ordner (samt Inhalt) entsprechend des Entstehungsdatums in einem gemeinsamen Ordner verschieben. Das heißt alle Ordner, die z.B. am 19.04.2025 entstanden sind werden in den neuen Ordner "19.04.2025" verschoben etc..

Beim Verschieben muss das Entstehungsdatum erhalten bleiben.
Ergebnis:

Zitat:

# Pfad zum Hauptordner festlegen
$hauptordner = "C:\Pfad\zum\Hauptordner"

# Alle Unterordner im Hauptordner abrufen
$unterordner = Get-ChildItem -Path $hauptordner -Directory

# Jedes Unterverzeichnis verarbeiten
foreach ($ordner in $unterordner) {
# Entstehungsdatum des Ordners abrufen
$erstellungsdatum = $ordner.CreationTime

# Datumsformat wie gewünscht (TT.MM.YYYY)
$datumFormat = $erstellungsdatum.ToString("dd.MM.yyyy")

# Zielordnername erstellen
$zielordner = Join-Path -Path $hauptordner -ChildPath $datumFormat

# Prüfen, ob der Zielordner bereits existiert, wenn nicht, erstellen
if (-not (Test-Path -Path $zielordner)) {
New-Item -ItemType Directory -Path $zielordner -Force | Out-Null
}

# Ordner in den Zielordner verschieben
$zielPfad = Join-Path -Path $zielordner -ChildPath $ordner.Name
Move-Item -Path $ordner.FullName -Destination $zielPfad -Force

# Optionale Ausgabe
Write-Host "Ordner '$($ordner.Name)' wurde nach '$datumFormat' verschoben."
}

Write-Host "Operation abgeschlossen!"
Testen musst du es selber. Wenn es Fehler gibt, frag die Konserve.

ET23 10.05.25 07:48

hast´n Nachricht....:T

Klappstulle_mit_Käse 20.05.25 17:04

So wird das Skript Probleme machen, wenn bereits Ordner mit Datum vorhanden sind.

Entweder:
a) Prüfen ob Ordner bereits ein Datum enthält. Wenn ja, dann nicht verschieben.
oder
b) Haupt- und Zielordner müssen unterschiedlich sein

PS: Als Datumsformat empfiehlt sich wegen der Sortierung meist: yyyy-MM-dd

Die Batch Datei inklusive Ignorieren bereits vorhandener Datumsordner könnte so aussehen:

Code:

@echo off
setlocal enabledelayedexpansion

REM Hauptordner ist D:\Downloads
set "HAUPTORDNER=D:\Downloads"

echo Sortiere Unterordner nach Erstellungsdatum...
echo.

REM Schleife durch alle Unterordner im Hauptordner
for /d %%D in ("%HAUPTORDNER%\*") do (
    REM Überprüfe, ob es sich nicht um einen Datumsordner handelt (Format YYYY-MM-DD)
    echo "%%~nxD" | findstr /r "^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$" > nul
    if errorlevel 1 (
        REM Ermittle das Erstellungsdatum des Ordners
        for /f "tokens=1-5 delims=.: " %%a in ('dir /tc "%%D" ^| findstr /r /c:"^[0-9]"') do (
            if "%%e"=="%%D" (
                set "DAY=%%a"
                set "MONTH=%%b"
                set "YEAR=%%c"
               
                REM Formatiere Tag und Monat mit führender Null falls nötig
                if !DAY! LSS 10 set "DAY=0!DAY!"
                if !MONTH! LSS 10 set "MONTH=0!MONTH!"
               
                REM Erstelle den Datumsordner (YYYY-MM-DD)
                set "DATUMSORDNER=!YEAR!-!MONTH!-!DAY!"
               
                REM Erstelle den Datumsordner, falls er nicht existiert
                if not exist "%HAUPTORDNER%\!DATUMSORDNER!" (
                    mkdir "%HAUPTORDNER%\!DATUMSORDNER!"
                    echo Datumsordner !DATUMSORDNER! erstellt.
                )
               
                REM Verschiebe den Unterordner in den entsprechenden Datumsordner
                echo Verschiebe "%%~nxD" nach "!DATUMSORDNER!"...
               
                REM Verwende ROBOCOPY, um das Erstellungsdatum zu erhalten und dann das Original zu löschen
                robocopy "%%D" "%HAUPTORDNER%\!DATUMSORDNER!\%%~nxD" /E /DCOPY:T /COPY:DT /MOVE
               
                REM Entferne leere Quellordner, falls ROBOCOPY sie nicht entfernt hat
                if exist "%%D" rd /s /q "%%D" 2>nul
            )
        )
    )
)

echo.
echo Fertig! Alle Unterordner wurden nach Erstellungsdatum sortiert.
pause


ET23 23.05.25 08:56

Hallo Klappstulle, besten Dank für die BATCH. Aber entweder bin ich zu blöd:( oder ... - es tut sich bei mir nichts.
Ich habe Deinen Text als *.bat abgespeichert (das Hauptordner-Verz. dementsprechen abgeändert) & die bat-Date in den Ordner der Dateien kopiert & dort gestartet.....nichts :cry::cry::cry::cry:

eitch100 24.05.25 09:03

Ich habe von der Syntax von Batch-Dateien jetzt wenig Ahnung, aber aus der Erfahrung von anderen "Sprachen" scheinen mir die Anführungszeichen in den "set" Befehlen zweifelhaft. Z.B.

set "HAUPTORDNER=D:\Downloads"

zu

set HAUPTORDNER="D:\Downloads"

Klappstulle_mit_Käse 24.05.25 13:17

Zitat:

Zitat von eitch100 (Beitrag 53083590)
scheinen mir die Anführungszeichen in den "set" Befehlen zweifelhaft

Das ist korrekt so. Kannst du in ner Eingabeaufforderung testen. mit "set" werden die Werte ordnungsgemäß abgezeigt.

Das garnichts angezeigt wird ist unwahrscheinlich. Irgendwas sollte ausgegeben werden. (Sind ja Echo-Zeilen drin)

Die Batch-Datei kann man von überall aus starten, da ja der Pfad angegeben wird.

eitch100 24.05.25 14:51

Zitat:

Zitat von Klappstulle_mit_Käse (Beitrag 53085006)
Das ist korrekt so. Kannst du in ner Eingabeaufforderung testen. mit "set" werden die Werte ordnungsgemäß abgezeigt.

Oh, ja, ich habe im anderen Srìpt geschaut und da war es auch schon so. Das hätte mir auch früher einfallen können. Letztlich ein klassischer Fall von: Einfach mal meine Klappe halten, wenn ich keine Ahnung habe... :)

Zum Problem: Das wird an den Ordnernamen liegen...
@ET23
Wie GENAU heißen denn deine Ordner, wenn sie erstellt wurden? Sie können ja nicht denselben Namen haben, wenn mehrere am Tag entstehen, wie du im Startpost schreibst. Oder möchtest du sie anhand des "Erstellungsdatums" (Also Ordneransicht - Details - Datum bzw. Rechtsklick auf Ordner - Eigenschaften - Erstellt) verschieben? Ob und wie das geht, geht direkt an Klappstulle.

Und kommt von der Batch wirklich gar nichts? Wie Klappstulle schon sagte, sollten die "echos" wenigstens angezeigt werden...

ET23 25.05.25 08:06

Guten Morgen,
nach Start der bat erscheint bei mir
1.)"Sortiere Unterordner nach......." und
2.) "Fertig Alle Unterordner........"
aber im Hauptordner, wo sich ja die aufzuteilenden Dateien befinden passiert nichts ?

Ich bräuchte/hätte gerne, daß alle im Hauptordner angefallenen Dateien od. auch manchmal Verzeichnisse nach ihrem Entstehungs-/Erschaffungs-Datum in dem jew.Unterorden mit dem Namen des Datums) einsortiert/verschoben werden.
Wenn das passiert ist, verschiebe ich dann die "Datumsordner" woanders hin und der Hauptorden bleibt wieder frei für neue Dateien bzw.Verzeichnisse.

Schönes Wochenende Euch allen & vielen, vielen Dank für Eure Unterstützung!! :T:T
Leider fehlt mir auf dem Gebiet noch einiges...:cry:
ET23

eitch100 25.05.25 09:39

Ja, der Code scheint da nicht zu funktionieren. Habe es auch gestestet... Außderdem scheint er nur die Ordner und nicht auch die Dateien zu prüfen.

Klappstulle_mit_Käse 25.05.25 11:27

Zitat:

Zitat von ET23 (Beitrag 52945134)
sollte alle Ordner (samt Inhalt) entspr. des Entstehungsdatums in einem gemeinsamen Ordner verschieben

Von Dateien war nicht die Rede :)


Code:

@echo off
setlocal enabledelayedexpansion

REM Hauptordner ist D:\Downloads
set "HAUPTORDNER=D:\Downloads"

echo Sortiere Unterordner und Dateien nach Erstellungsdatum...
echo.

REM ========== TEIL 1: Unterordner sortieren ==========
echo === Verarbeite Unterordner ===
for /d %%D in ("%HAUPTORDNER%\*") do (
    REM Überprüfe, ob es sich nicht um einen Datumsordner handelt (Format YYYY-MM-DD)
    echo "%%~nxD" | findstr /r "^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$" > nul
    if errorlevel 1 (
        REM Ermittle das Erstellungsdatum des Ordners
        for /f "tokens=1-5 delims=.: " %%a in ('dir /tc "%%D" ^| findstr /r /c:"^[0-9]"') do (
            if "%%e"=="%%D" (
                set "DAY=%%a"
                set "MONTH=%%b"
                set "YEAR=%%c"
               
                REM Formatiere Tag und Monat mit führender Null falls nötig
                if !DAY! LSS 10 set "DAY=0!DAY!"
                if !MONTH! LSS 10 set "MONTH=0!MONTH!"
               
                REM Erstelle den Datumsordner (YYYY-MM-DD)
                set "DATUMSORDNER=!YEAR!-!MONTH!-!DAY!"
               
                REM Erstelle den Datumsordner, falls er nicht existiert
                if not exist "%HAUPTORDNER%\!DATUMSORDNER!" (
                    mkdir "%HAUPTORDNER%\!DATUMSORDNER!"
                    echo Datumsordner !DATUMSORDNER! erstellt.
                )
               
                REM Verschiebe den Unterordner in den entsprechenden Datumsordner
                echo Verschiebe Ordner "%%~nxD" nach "!DATUMSORDNER!"...
               
                REM Verwende ROBOCOPY, um das Erstellungsdatum zu erhalten und dann das Original zu löschen
                robocopy "%%D" "%HAUPTORDNER%\!DATUMSORDNER!\%%~nxD" /E /DCOPY:T /COPY:DT /MOVE
               
                REM Entferne leere Quellordner, falls ROBOCOPY sie nicht entfernt hat
                if exist "%%D" rd /s /q "%%D" 2>nul
            )
        )
    )
)

REM ========== TEIL 2: Dateien im Hauptordner sortieren ==========
echo.
echo === Verarbeite Dateien im Hauptordner ===

REM Temporäre Datei für die Dateiliste erstellen
set "TEMP_FILE=%TEMP%\filelist_%RANDOM%.txt"
dir "%HAUPTORDNER%" /tc /a-d /b > "%TEMP_FILE%"

REM Schleife durch alle Dateien im Hauptordner
for /f "delims=" %%F in ('dir "%HAUPTORDNER%" /b /a-d 2^>nul') do (
    REM Ermittle das Erstellungsdatum der Datei
    for /f "tokens=1-5 delims=.: " %%a in ('dir /tc "%HAUPTORDNER%\%%F" ^| findstr /r /c:"^[0-9]"') do (
        set "DAY=%%a"
        set "MONTH=%%b"
        set "YEAR=%%c"
       
        REM Formatiere Tag und Monat mit führender Null falls nötig
        if !DAY! LSS 10 set "DAY=0!DAY!"
        if !MONTH! LSS 10 set "MONTH=0!MONTH!"
       
        REM Erstelle den Datumsordner (YYYY-MM-DD)
        set "DATUMSORDNER=!YEAR!-!MONTH!-!DAY!"
       
        REM Erstelle den Datumsordner, falls er nicht existiert
        if not exist "%HAUPTORDNER%\!DATUMSORDNER!" (
            mkdir "%HAUPTORDNER%\!DATUMSORDNER!"
            echo Datumsordner !DATUMSORDNER! erstellt.
        )
       
        REM Verschiebe die Datei in den entsprechenden Datumsordner
        echo Verschiebe Datei "%%F" nach "!DATUMSORDNER!"...
        move "%HAUPTORDNER%\%%F" "%HAUPTORDNER%\!DATUMSORDNER!\%%F" >nul 2>&1
       
        REM Verlasse die innere Schleife nach dem ersten Treffer
        goto :next_file
    )
    :next_file
)

REM Temporäre Datei löschen
if exist "%TEMP_FILE%" del "%TEMP_FILE%"

echo.
echo Fertig! Alle Unterordner und Dateien wurden nach Erstellungsdatum sortiert.
pause


ET23 26.05.25 08:34

Vielen Dank für den Batch,

aber wenn ich den starte erschein nach der Meldung
"REM Entferne leere Quellordner, falls ROBOCOPY sie nicht entfernt hat
if exist "%%D" rd /s /q "%%D" 2>nul" >> "Datei nicht gefunden"
und beim Schluß auch noch eine Meldung, die ich aber auf Grund der Geschwindigkeit nicht lesen kann


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.