Mögliche fehler?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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:

/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
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Kurti801 
Beitragsersteller
 16.05.2025, 08:53

In erster Linie danke natürlich für deine große Hilfe:)!
Der grund warum ich die ganze zeit das einfach nur paste ist folgender: ich muss alle paar dateien das verzeichnis ändern und da bin ich so schneller als würde ich jedesmal eine datei ändern

Erzesel  16.05.2025, 14:25
@Kurti801
ich muss alle paar dateien das verzeichnis ändern und da bin ich so schneller als würde ich jedesmal eine datei ändern

Statt jedesmal den Pfad händisch einzugeben/zu änden, kannst Du auch die Batch als Drop-Target verwenden.

dropDemo.cmd

@echo off
chcp 65001 >nul


rem prüfe ob Dateien/Ordner  auf  diese Batchdatei  gezogen  wurden
if "%~1"=="" (
    echo Es wurden keine Dateien/Ordner übergeben.
    echo Ziehe ein oder mehr markierte Dateien/Ordner auf "%~nx0" !
    timeout 10 >nul
    exit /b
)


rem beim "Droppen" von Dateien wird (ohne explizte Festlegung) der erste übergeben Pfad zum Arbeitsverzeichnis der Batch
rem deshalb dieses  explizit festlegen
pushd "%~dp0"  &rem ordner in  welchem die Batch gespeichert ist
echo Aktuelles Arbeitsverzeichnis "%cd%"
echo:
echo übergebene Parameter mal Anzeigen:
echo %* 


:::::::::  hierauf  kommt es an :::::::::::


rem der  folgende Loop arbeitet  alle  an die Batch übegebenen/gedroppten Datein/Ordner...
for %%G in (%*) do (
    rem was auch  immer  mit allen übergebenen Parametern  geschehen  soll
    rem ist das  übergebene ein Ordner?
    echo %%~aG|find /i "d" >nul &&(
        echo Ordner:
        echo voller Pfad: "%%~fG"
        echo Laufwerk   : "%%~dG"
        echo Name       : "%%~nG"
        echo Name + Ext : "%%~nxG"
         rem der Zugriff auf innehalb eines Klammerblocks gesetzte Variablen ist umständlich.
         rem deshalb sollte man derartige Operationen in eine Subroutine auslagerern und  ihr  das nötige als Parameter übergeben:
        call :machwas "%%~fG"
        echo ...wieder  zurück im Loop...
        echo:
    )||(
        echo  Datei: "%%~nxG" ...kann nix  damit anfangen!!!!
        echo:
    )


)
pause
exit /b


:::: Subroutines :::
:machwas
echo ich  bin in der Subroutine %0


set "quelle=%~f1"
set "ziel=I:\%~pnx1"
set "liste=%userprofile%\Documents\OrdnerListe.txt"
set "renamedFolderName=%~n1 -Archived%~x1"


rem was auch immer Du auch in einer separaten Batch tun  würdest
echo QuellOrdner: "%quelle%" 
echo ZielOrdner: "%ziel%"
echo umbenannter QuellName: "%renamedFolderName%"
echo umbenannter voller QuellPfad: "%~dp1%renamedFolderName%"


exit /b

Einfach zu verarbeitende Ordner oder Dateien markieren und auf eine Batchdatei ziehen geht doch noch schneller.

Gerade für stereotype wiederkehrende Operationen auf (manuell) ausgewählte Dateien ist die Sache unschlagbar . (Einschränkung: die Gesamtlänge der in %* übergebenen Pfade sollte ca. 8000 Zeichen nicht überschreiten. ( https://learn.microsoft.com/de-de/troubleshoot/windows-client/shell-experience/command-line-string-limitation )

Markiere zum testen einfach beliebige Dateien/Ordner und ziehe diese auf die Batchdatei die Demo erkennt von selbst was womit zu tun ist

Hi, dein Grundgerüst ist gut. Du musst nur in der Batch-Datei %%N statt %N benutzen und Robocopy mit /MOV aufrufen, dann verschiebst du alle Dateien und kannst direkt umbenennen.