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

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: tomreis
tomreis 01.04.2020 aktualisiert um 23:42:43 Uhr
Goto Top
Keiner eine Idee ??? Oder sollte das DOS so nicht hergeben - das kann ich nicht so recht glauben face-smile ???
Mitglied: TK1987
TK1987 03.04.2020 aktualisiert um 11:39:41 Uhr
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
Mitglied: tomreis
tomreis 05.04.2020 um 18:36:39 Uhr
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
Mitglied: TK1987
TK1987 05.04.2020 aktualisiert um 20:01:57 Uhr
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
Mitglied: tomreis
tomreis 06.04.2020 um 16:17:49 Uhr
Goto Top
Danke für den Tipp - werde ich probieren !!!