Mögliche fehler?
moin, ich habe einen code für cmd geschrieben, der mir den archivierungsprozess erleichtern soll, er funktioniert und alles schön und gut, bloß dass - warum auch immer - im archivlaufwerk, leere ordner stehen und auf dem ursprungsdatenträger nach dem Löschen und umbenennen natürlich auch - da soll es aber auch so sein. nächstes problem: ich habe jetzt testordner erstellt um der sache auf den grund zu gehen und stelle fest dass nicht alle ordner leer sind, nur ein paar, aus meiner sicht zufällig ausgewählte.
set "quelle=I:\Ordner 1\Ordner 2\TestOrdner" & set "ziel=V:\Ordner 1\Ordner 2" & set "liste=C:\Users\*meinUser*\Documents\OrdnerListe.txt"
for /f "usebackq delims=" %N in ("%liste%") do (
echo Verarbeite Ordner: %N
robocopy "%quelle%\%N" "%ziel%\%N" /E /COPY:DATSO /R:3 /W:10 /MT:8 /LOG+:kopierlog.txt
)
das ist der code schnipsel für das kopieren, bevor eine frage dazu kommt: nein, die verzeich isse sind nicht fehlerhaft, die sollen genau so sein wie sie dort sind.
das funktioniert einwandfrei und wenn man nach dem kopieren nachschaut sind auch alle verzeichnisse, unterverzeichnisse und dateien vorhanden.
set "quelle=I:\Ordner 1\Ordner 2\TestOrdner"
set "liste=C:\Users\*meinUser*\Documents\OrdnerListe.txt"
for /f "usebackq delims=" %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"
)
das is der code schnipsel für das automatische löschen der Inhalte der Unterordner (hier im beispiel der ersten Unterordner von "TestOrdner") und das dann anschließende umbenennen jener mit einer ergänzung "- Archiv"
die ordner die kopiert bzw gelöscht und umbenannt werden sollen stehen in dieser OrdnerListe.txt datei
kann mir bitte jemand sagen was ich da falsch gecoded haben könnte oder was cmd vllt falsch interpretiert? und dazu dann bitte gleich einen entsprechenden verbesserungs vorschlag?
achso, der code ist in 2 schnipseln damit der code weniger anfällig ist für fehler (ironischerweise), natürlich würde man ihn auch als einen einzigen ausführen können, wenn man es wollen würde
2 Antworten
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
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.
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