pastest/schreibst Du den Code etwa jedesmal von Hand in ein Consolfenster um diesen Auszuführen? Anders kan ich mir die einfache %-Zeichen in der Deklaration der Laufvariablen nicht erklären. (%N)
Warum schreibst Du den Code nicht einfach in eine WindowsBatchdatei (.cmd) und verdoppelst die %-Zeichen in den Laufvariablen (%%N)
warum auch immer - im archivlaufwerk, leere ordner stehen
Logisch. wenn robocopy nicht über die nötigen Rechte verfügt um Dateien/Ordner samt Berechigungen und Eigentümerinformationen zu kopieren
Du hast doch robocopy angewiesen seine Operationen in die Datei "kopierlog.txt" zu loggen. Warum schaust Du nicht dort nach, was schief läuft?
... FEHLER 5 (0x00000005) NTFS-Sicherheit wird in Zielverzeichnis kopiert usw...
Das Problem , Du verwendest den Parameter /copy:DATSO !
Ein kleiner Blick in die Befehlsbeschreibung von robocopy hätte genügt:
- https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
- https://ss64.com/nt/robocopy.html
/copy: <copyflags> Specifies which file properties to copy. The valid values for this option are:
D - Data
A - Attributes
T - Time stamps
X - Skip alt data streams
S - NTFS access control list (ACL)
O - Owner information
U - Auditing information
The default value for the /COPY option is DAT (data, attributes, and time stamps). The X flag is ignored if either /B or /ZB is used.
Das explizite Übertragen/setzen von Zugriffsrechten erfordert den Zugriff ais Administrator. Allerdings ist ein Kopiernen der Zugriffsrechte und Besitzerinformationen für ein Backup eher hinderlich, da im Ernstfall bei der Wiederherstellung von Daten genau dieser Informationen im Wege stehen! (Wenn es Hart auf hart kommt hat sich nach einem Crash auch die GUID (Kennung) des Eigentümers (Owner) der Dateien geändert und diese müsste von "neuen" Owner umständlich übernommen werden)
/copy:DATSO ist einfach zu viel des Guten. Da /copy:DAT ohnehin der implizite Standard ist, kann man den gesamten Parameter weglassen.
...soviel zum ersten Teil.
Der 2. Code tut genau das was er soll.
- In allen von der Ordnerliste erfassten Ordnern die Datein und Unterverzeichnisse löschen .
- die betreffenden Ordner nach Deiner Vorgabe umbenennen
...Klappt...
Hier das ganze zusammengefasst in einer Batchdatei.
Demo.cmd
@echo off
chcp 65001 >nul &rem UTF8 Zeichen nutzen
set "quelle=I:\Ordner 1\Ordner 2\TestOrdner"
set "ziel=V:\Ordner 1\Ordner 2"
set "liste=%userprofile%\Documents\OrdnerListe.txt"
for /f "usebackq tokens=*" %%N in ("%liste%") do (
echo Verarbeite Ordner: %%N
robocopy "%quelle%\%%N" "%ziel%\%%N" /E /R:3 /W:10 /MT:8 /LOG+:"kopierlog.txt"
)
for /f "usebackq tokens=*" %%N in ("%liste%") do (
del /f /s /q "%quelle%\%%N\*"
for /d %%U in ("%quelle%\%%N\*") do rmdir /s /q "%%U"
ren "%quelle%\%%N" "%%N - Archiv"
)
pause
Noch ein paar allgemeine Hinweise zu Dingen welch ich geändert habe:
Im "Header" von for/f-Loops möglichst auf "Leere Delims" ("delims=") verzichten! Statt dessen "tokens=*"
Was Deine Löschroutine angeht, so ist diese zwar völlig ok. Aber überzogen.
Da Du ohnehin alle Dateien und unterverzeichnisse löscht. und "Ordner - Archiv" augenscheinlich nur als "Mitteilung" verbleiben soll, das dessen Daten verlagert wurden, kann man ebensogut auf die Innere Schleife (%%U) verzichten.
Mein "effizienter Vorschlag wäre:
- den Ordner samt komplettem Inhalt löschen
- ein Neuen Ordner mit gleichem Namen zzgl. dem Sufix " - Archiv" erstellen.
demo2.cmd
rem alles wie gehabt
rem Neue Löschroutine:
for /f "usebackq tokens=*" %%N in ("%liste%") do (
rd /s /q "%quelle%\%%N"
md "%quelle%\%%N - Archiv"
)
pause