Via Batch Dateien mit Zahlen-Name größer als löschen ?
Guten morgen liebe Community,
Ich stehe vor einem Problem (was auch sonst )
Ich möchte gerne Dateien kopieren/löschen deren Name größer gleich >=, bzw kleiner gleich <= ist.
Die Dateinamen sind so aufgebaut:
4475_13356489.pdf
4500_55567423.pdf
30501_55574561.pdf
...
...
Worauf ich speziell hinaus möchte ist das alle Dateien mit Name >= (größer gleich) 4500_*.pdf auf Ort X und alle dateien die <= (kleiner gleich) 4475_*.pdf auf Ort Y zu kopieren und anschließend zu löschen.
Ist dies mit Batch einfach zu gestalten ?
Es muss nicht zwingend in einer Batch datei stehen es kann auch in 2 gesplittet werden.
Ihr habt mir hier schonmal sehr erfolgreich geholfen.
Das ist der Code den ich derzeit benutze.
Vielen Dank schon mal im voraus !
Ich möchte gerne Dateien kopieren/löschen deren Name größer gleich >=, bzw kleiner gleich <= ist.
Die Dateinamen sind so aufgebaut:
4475_13356489.pdf
4500_55567423.pdf
30501_55574561.pdf
...
...
Worauf ich speziell hinaus möchte ist das alle Dateien mit Name >= (größer gleich) 4500_*.pdf auf Ort X und alle dateien die <= (kleiner gleich) 4475_*.pdf auf Ort Y zu kopieren und anschließend zu löschen.
Ist dies mit Batch einfach zu gestalten ?
Es muss nicht zwingend in einer Batch datei stehen es kann auch in 2 gesplittet werden.
Ihr habt mir hier schonmal sehr erfolgreich geholfen.
Das ist der Code den ich derzeit benutze.
echo off
echo Dateien werden kopiert. Das Fenster schliesst auotmatisch !
set "SrcDir=%userprofile%\Documents\My Scans"
set "DestDir=G:"
set "FileType=pdf"
for /f "tokens=1* delims=_" %%a in ('dir /b /a:-d "%SrcDir%\*_*.%FileType%" 2^>NUL') do (
call :RenOldVersion "%DestDir%\%%a\%%a_%%b"
xcopy "%SrcDir%\%%a_%%b" "%DestDir%\%%a\%%a_%%b*" > NUL
)
del "%userprofile%\Documents\My Scans\*.pdf"
:RenOldVersion
set /a "NumFiles=0"
for /f "tokens=1 delims=:" %%c in ('dir /b /a:-d "%~dpn1*%~x1" 2^>NUL ^| findstr /n "^"') do (
set /a "NumFiles=%%c"
)
if %NumFiles% gtr 0 ren "%~1" "%~n1(%NumFiles%)%~x1"
exit /b
Vielen Dank schon mal im voraus !
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 179027
Url: https://administrator.de/contentid/179027
Ausgedruckt am: 29.03.2024 um 01:03 Uhr
21 Kommentare
Neuester Kommentar
Hallo weaslflink!
Könnte etwa so gehen (ungetestet):
Wegen des "
Im Zielordner bereits vorhandene gleichnamige Dateien würden in dieser Fassung überschrieben werden.
Dateien, deren Name mit 4476 bis 4499 beginnt würden im Quellordner verbleiben. Wenn es darum ginge, den obigen Batch weiter zu verwenden, müsstest Du noch die Vorgangsweise für diese Dateien bekannt geben, da ja am Ende alle Dateien gelöscht würden ...
...ansonsten könnten die Zeilen 10 und 11 durch
ersetzt werden.
Grüße
bastla
P.S.: In Zeile 14 Deines bisherigen Batches fehlt noch
und Zeile 13 sollte besser
lauten ...
Könnte etwa so gehen (ungetestet):
echo off & setlocal
set "SrcDir=%userprofile%\Documents\My Scans"
set "FileType=pdf"
set /a Nr1=4500
set "Dest1=X:\"
set /a Nr2=4475
set "Dest2=Y:\"
for /f "tokens=1* delims=_" %%a in ('dir /b /a:-d "%SrcDir%\*_*.%FileType%" 2^>NUL') do (
if %%a geq %Nr1% echo move "%SrcDir%\%%a_%%b" "%Dest1%"
if %%a leq %Nr2% echo move "%SrcDir%\%%a_%%b" "%Dest2%"
)
echo
" vor dem"move
" wird der Befehl zum Verschieben (zum Testen) nur angezeigt, aber noch nicht ausgeführt ...Im Zielordner bereits vorhandene gleichnamige Dateien würden in dieser Fassung überschrieben werden.
Dateien, deren Name mit 4476 bis 4499 beginnt würden im Quellordner verbleiben. Wenn es darum ginge, den obigen Batch weiter zu verwenden, müsstest Du noch die Vorgangsweise für diese Dateien bekannt geben, da ja am Ende alle Dateien gelöscht würden ...
...ansonsten könnten die Zeilen 10 und 11 durch
if %%a geq %Nr1% (
call :RenOldVersion "%Dest1%\%%a\%%a_%%b"
xcopy "%SrcDir%\%%a_%%b" "%Dest1%\%%a\%%a_%%b*" > NUL
) else (
if %%a leq %Nr2% (
call :RenOldVersion "%Dest2%\%%a\%%a_%%b"
xcopy "%SrcDir%\%%a_%%b" "%Dest2%\%%a\%%a_%%b*" > NUL
) else (
echo Nr zwischen 4476 und 4499
)
)
Grüße
bastla
P.S.: In Zeile 14 Deines bisherigen Batches fehlt noch
exit /b
del "%SrcDir%\*_*.%FileType%"
Hallo weaslflink!
Da Du 4500 und 4475 vorgibst, hatte ich eigentlich auch angenommen, dass die Grenzen ernst gemeint sind - Du kannst aber einfach in meinem Ansatz oben 4475 durch 4499 ersetzen ...
Anyhow - meine Hinweise oben hätten sich in Deinem bisherigen Batch etwa so niederschlagen sollen:
Wenn tatsächlich nur eine Unterscheidung "unter 4500" und "ab 4500" zu treffen ist, lässt sich das noch auf
Zum Testen sind hier wieder "Sicherheits-
Das fehlende "
Grüße
bastla
[Edit] Korrrekturen (siehe unten vorgenommen) [/Edit]
Da Du 4500 und 4475 vorgibst, hatte ich eigentlich auch angenommen, dass die Grenzen ernst gemeint sind - Du kannst aber einfach in meinem Ansatz oben 4475 durch 4499 ersetzen ...
Anyhow - meine Hinweise oben hätten sich in Deinem bisherigen Batch etwa so niederschlagen sollen:
echo off & setlocal
echo Dateien werden kopiert. Das Fenster schliesst auotmatisch !
set "SrcDir=%userprofile%\Documents\My Scans"
set "FileType=pdf"
set /a Nr1=4500
set "Dest1=X:"
set /a Nr2=4499
set "Dest2=Y:"
for /f "tokens=1* delims=_" %%a in ('dir /b /a:-d "%SrcDir%\*_*.%FileType%" 2^>NUL') do (
if %%a geq %Nr1% (
call :RenOldVersion "%Dest1%\%%a\%%a_%%b"
echo xcopy "%SrcDir%\%%a_%%b" "%Dest1%\%%a\%%a_%%b*" > NUL
) else (
if %%a leq %Nr2% (
call :RenOldVersion "%Dest2%\%%a\%%a_%%b"
echo xcopy "%SrcDir%\%%a_%%b" "%Dest2%\%%a\%%a_%%b*" > NUL
) else (
REM #nicht mehr erforderlich# echo Nr zwischen 4476 und 4499
)
)
)
echo del "%SrcDir%\*_*.%FileType%"
exit /b
:RenOldVersion
set /a "NumFiles=0"
for /f "tokens=1 delims=:" %%c in ('dir /b /a:-d "%~dpn1*%~x1" 2^>NUL ^| findstr /n "^"') do (
set /a "NumFiles=%%c"
)
if %NumFiles% gtr 0 echo ren "%~1" "%~n1(%NumFiles%)%~x1"
exit /b
echo off & setlocal
echo Dateien werden kopiert. Das Fenster schliesst auotmatisch !
set "SrcDir=%userprofile%\Documents\My Scans"
set "FileType=pdf"
set /a Grenze=4500
set "Dest1=X:"
set "Dest2=Y:"
for /f "tokens=1* delims=_" %%a in ('dir /b /a:-d "%SrcDir%\*_*.%FileType%" 2^>NUL') do (
if %%a geq %Nr1% (
call :RenOldVersion "%Dest1%\%%a\%%a_%%b"
echo xcopy "%SrcDir%\%%a_%%b" "%Dest1%\%%a\%%a_%%b*" > NUL
) else (
call :RenOldVersion "%Dest2%\%%a\%%a_%%b"
echo xcopy "%SrcDir%\%%a_%%b" "%Dest2%\%%a\%%a_%%b*" > NUL
)
echo del "%SrcDir%\*_*.%FileType%"
exit /b
:RenOldVersion
set /a "NumFiles=0"
for /f "tokens=1 delims=:" %%c in ('dir /b /a:-d "%~dpn1*%~x1" 2^>NUL ^| findstr /n "^"') do (
set /a "NumFiles=%%c"
)
if %NumFiles% gtr 0 echo ren "%~1" "%~n1(%NumFiles%)%~x1"
exit /b
echo
s" eingebaut (Zeilen 15, 19, 25, 35 bzw 14, 17, 19, 29) ...Das fehlende "
exit /b
" sorgt dafür, dass der Batch nach Durchlaufen der Schleife und dem Löschen der Dateien beendet und nicht nochmals das Unterprogramm ":RenOldVersion" durchlaufen wird.Grüße
bastla
[Edit] Korrrekturen (siehe unten vorgenommen) [/Edit]
Hallo weaslflink,
ich sehe, dass "NumFiles" in Zeile 23 gesetzt wird. Deine Ausgabe deutet aber darauf hin, dass "NumFiles" nicht definiert ist. Also liegt die Vermutung nahe, dass in Zeile 26 die Variable gelöscht wird. Das wiederum ergibt für mich auf den ersten Blick keinen Sinn, da das nur passieren kann, wenn %%c leer ist, was imho aber nicht passieren sollte.
Daher meine Frage mit dem Übergabewert in Zeile 12.
Was passiert (wird ausgegeben), wenn Du das Ende wie folgt änderst:
Die Pause zum abbrechen, da kein dranhängen erfolgen würde.
Gruß icsAT
ich sehe, dass "NumFiles" in Zeile 23 gesetzt wird. Deine Ausgabe deutet aber darauf hin, dass "NumFiles" nicht definiert ist. Also liegt die Vermutung nahe, dass in Zeile 26 die Variable gelöscht wird. Das wiederum ergibt für mich auf den ersten Blick keinen Sinn, da das nur passieren kann, wenn %%c leer ist, was imho aber nicht passieren sollte.
Daher meine Frage mit dem Übergabewert in Zeile 12.
Was passiert (wird ausgegeben), wenn Du das Ende wie folgt änderst:
:RenOldVersion
echo Uebergabewert: %1
set /a "NumFiles=0"
for /f "tokens=1 delims=:" %%c in ('dir /b /a:-d "%~dpn1*%~x1" 2^>NUL ^| findstr /n "^"') do (
echo set /a "NumFiles=%%c"
)
if %NumFiles% gtr 0 ren "%~1" "%~n1(%NumFiles%)%~x1"
echo hier abbrechen
pause
exit /b
Die Pause zum abbrechen, da kein dranhängen erfolgen würde.
Gruß icsAT
Hallo weaslflink,
das "%%c" enthält in jedem Durchlauf das jeweils aktuelle Ergebnis der For-Schleife.
Wenn Du Dir Dein Ergebnis ansiehst sollte schnell (wobei ich da in Deinem Post von gestern auch nicht drüber gestolpert bin) klar werden, wo das Problem ist. Nach Zeile 8 folgt Zeile 29. Warum? Du hast weder das "FOR" noch das "ELSE" vom "IF" korrekt mit ")" beendet!
Also füge die beiden beendenden Klammern wieder ein und der Ablauf sollte wieder passen. Ich denke die Klammern sind Dir und bastla im Laufe der Zeit "verloren" gegangen
Gruß icsAT
das "%%c" enthält in jedem Durchlauf das jeweils aktuelle Ergebnis der For-Schleife.
Wenn Du Dir Dein Ergebnis ansiehst sollte schnell (wobei ich da in Deinem Post von gestern auch nicht drüber gestolpert bin) klar werden, wo das Problem ist. Nach Zeile 8 folgt Zeile 29. Warum? Du hast weder das "FOR" noch das "ELSE" vom "IF" korrekt mit ")" beendet!
Also füge die beiden beendenden Klammern wieder ein und der Ablauf sollte wieder passen. Ich denke die Klammern sind Dir und bastla im Laufe der Zeit "verloren" gegangen
Gruß icsAT
Hallo weaslflink,
hier ungetestet der Code aus Deinem Post vom 18.01.2012, 08:39:38 Uhr ergänzt um die schließenden Klammern:
Gruß icsAT
hier ungetestet der Code aus Deinem Post vom 18.01.2012, 08:39:38 Uhr ergänzt um die schließenden Klammern:
echo on & setlocal
echo Dateien werden kopiert. Das Fenster schliesst auotmatisch !
set "SrcDir=%userprofile%\Documents\MyScans"
set "Dest1=G:"
set "Dest2=F:"
set "FileType=pdf"
set /a Grenze=4500
for /f "tokens=1* delims=_" %%a in ('dir /b /a:-d "%SrcDir%\*_*.%FileType%" 2^>NUL') do (
if %%a geq %Grenze% (
call :RenOldVersion "%Dest2%\%%a\%%a_%%b"
xcopy "%SrcDir%\%%a_%%b" "%Dest2%\%%a\%%a_%%b*" > NUL
) else (
call :RenOldVersion "%Dest1%\%%a\%%a_%%b"
xcopy "%SrcDir%\%%a_%%b" "%Dest1%\%%a\%%a_%%b*" > NUL
)
)
echo del "%SrcDir%\*_*.%FileType%"
exit /b
:RenOldVersion
set /a "NumFiles=0"
for /f "tokens=1 delims=:" %%c in ('dir /b /a:-d "%~dpn1*%~x1" 2^>NUL ^| findstr /n "^"') do set /a "NumFiles=%%c"
if %NumFiles% gtr 0 ren "%~1" "%~n1(%NumFiles%)%~x1"
goto :eof
Gruß icsAT
Hallo bastla,
gerne doch.
Er ist steht's bemüht in diesem Forum nicht nur fleissig Experten-Wissen aufzusaugen, sondern auch hin und wieder, wenn die knappe Zeit es denn mal zu lässt, etwas Basis-Wissen weiterzugeben, damit die Experten dann genügend Zeit haben sich um seine Probleme zu kümmern
Gruß icsAT
gerne doch.
Er ist steht's bemüht in diesem Forum nicht nur fleissig Experten-Wissen aufzusaugen, sondern auch hin und wieder, wenn die knappe Zeit es denn mal zu lässt, etwas Basis-Wissen weiterzugeben, damit die Experten dann genügend Zeit haben sich um seine Probleme zu kümmern
Gruß icsAT