tomreis
Goto Top

DOS BATCH (kein SHELL) zum Dateiverschieben nach Dateigrösse

Hallo ich wende mich an die DOS Spezialisten unter Euch.

Aufgabe: verschieben (bzw. kopieren und löschen) von Dateien mit einem Datumsstring am Anfang (2020-03-30......)

Ich habe bislang folgende Lösung:

@echo off &setlocal
set "quelle=d:\Quellestart"  
set "ziel=d:\Quelleziel"  
for %%a in ("%quelle%\*.*") do (  
    for /f "tokens=1,2 delims=-" %%b in ("%%~na") do (  
        if not exist "%ziel%\%%~b\%%~c" md "%ziel%\%%~b\%%~c" >nul  
        move "%%a" "%ziel%\%%~b\%%~c"  
    )
)

Dabei werden aber ev. bereits vorhandene Dateien kommentarlos überschrieben. Ich möchte ein Überschreiben am Zielort (falls vorhanden) aber nur, wenn die vorhandene Datei kleiner ist als die Quelldatei.

Die Dateigröße kann man ja z.B. mit %~za ermitteln. Ich habe nur keine Lösung diese Prüfung in den vorhandenen Batch einzubauen.

Am Ende der Aktion soll das Quellverzeichnis geleert sein !

Ich hoffe auf Anregungen und Bedanke mich Vorab !!!

Gruß Tom

Content-Key: 562343

Url: https://administrator.de/contentid/562343

Printed on: April 28, 2024 at 15:04 o'clock

Member: tomreis
tomreis Apr 01, 2020 updated at 21:42:43 (UTC)
Goto Top
Keiner eine Idee ??? Oder sollte das DOS so nicht hergeben - das kann ich nicht so recht glauben face-smile ???
Member: TK1987
TK1987 Apr 03, 2020 updated at 09:39:41 (UTC)
Goto Top
Moin,

Zitat von @tomreis:
Keiner eine Idee ???
hat damit weniger zu tun, als viel mit der damit dass...

... du bereits einen Thread mit einer vernüftig funktionierenden Powershell Lösung zu dem Thema hattest
... die Aktzeptanz gegenüber Batch hier (zu Recht!) immer weiter sinkt. Die meisten rufen, wenn sie Batch hören, erstmal ihren Paläontologen an, um nach Rat zu fragen 😛.

Verstehe wer will, warum du das Ganze jetzt unbedingt auch noch im kryptischen, sehr fehleranfälligen Batch mit hoher Laufzeit bei vielen Dateien durch die If-Abfragen haben willst.

Aber wenn es dich glücklich macht:
@echo off &setlocal
set quelle=d:\Quellestart
set ziel=d:\Quelleziel

for %%a in ("%quelle%\*.*") do (  
	for /f "tokens=1,2 delims=-" %%b in ("%%~na") do (  
		for /f "delims=" %%d in ("%ziel%\%%~b\%%~c\%%~nxa") do (  
			if %%~zd lss %%~za (
				if not exist "%ziel%\%%~b\%%~c" md "%ziel%\%%~b\%%~c" >nul  
				move "%%a" "%ziel%\%%~b\%%~c"  
				) else (del "%%a")  
			)
		)
	)

Gruß Thomas
Member: tomreis
tomreis Apr 05, 2020 at 16:36:39 (UTC)
Goto Top
Ganz herzlichen Dank, dass Du mir dies noch geschrieben hast. Es funktioniert einwandfrei !!!! Mit Powershell kann man eben nicht überall arbeiten - z.B. wenn einem fehlende Rechte das Leben schwer machen face-smile // Also nochmals vielen lieben dank für Deine Mühen !!! Gruß Tom
Member: TK1987
TK1987 Apr 05, 2020 updated at 18:01:57 (UTC)
Goto Top
Zitat von @tomreis:
Mit Powershell kann man eben nicht überall arbeiten - z.B. wenn einem fehlende Rechte das Leben schwer machen face-smile
Doch, kann man.

Der Befehl
Set-ExecutionPolicy RemoteSigned -Force
setzt die Ausführungsrichtlinie global für alle User, deswegen benötigt er Adminrechte. Man kann sie aber auch stattdessen nur für den aktuell angemeldeten User setzen, dass benötigt keine Adminrechte.
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force

Die Zweite, wahrscheinlich noch besser Methode, ist die Execution-Policy erst gar nicht zu setzen und das Script mit -ExecutionPolicy ByPass aufzurufen.
Einfach irgendwo eine Verknüpfung anlegen und als Ziel
powershell -ExecutionPolicy Bypass -File "C:\Pfad\zum\Skript.ps1"  
wählen. Dann kannst du der Verknüpfung sogar noch ein passendes Icon verpassen.

Gruß Thomas
Member: tomreis
tomreis Apr 06, 2020 at 14:17:49 (UTC)
Goto Top
Danke für den Tipp - werde ich probieren !!!