weaslflink
Goto Top

Via Batch Dateien mit Zahlen-Name größer als löschen ?

Guten morgen liebe Community,

Ich stehe vor einem Problem (was auch sonstface-wink )

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 !

Content-Key: 179027

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

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: bastla
bastla 17.01.2012 um 09:05:47 Uhr
Goto Top
Hallo weaslflink!

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%"  
) 
Wegen des "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
  )
)
ersetzt werden.

Grüße
bastla

P.S.: In Zeile 14 Deines bisherigen Batches fehlt noch
exit /b
und Zeile 13 sollte besser
del "%SrcDir%\*_*.%FileType%"
lauten ...
Mitglied: weaslflink
weaslflink 17.01.2012 um 09:32:40 Uhr
Goto Top
Hallo bastla face-smile,

vielen erstmal das du mir schon wieder hilfst.

Ich würde gerne die obigen Batch weiterverwenden.

Ich erläutere mal die Vorgehensweise.

Ich habe in einem Ordner mehrer PDF-Dateien. Diese fangen mit verschiedenen Zahlen an. Hier ein Bsp.:
36_*.pdf
3474_*.pdf
20501_*.pdf
6603_*.pdf
usw.

also es sind "quasi" fortlaufende zahlen am anfang. Diese sollen via Xcopy in Ordner Y in die entsprechenden Ordner (36,3474,20501,6603,....) kopiert werden und falls der Dateiname schon vorhanden ist am Schluss erweitert werden (siehe RenOldVersion). Daher ist es sehr Wichtig ! das die Dateien nicht überschrieben werden.

Nun ist das Problem das mein USB-Speicher voll ist und ich diese Ordner (80Stk) auf 2 USB-Sticks verteilen musste.
Deshalb brauch ich ein Scribt welche die Dateien deren Anfang ( von 0_*pdf bis 4999_*.pdf) auf meinen USB-Stick X und alle Dateien deren Anfang größer gleich 4500_*.pdf auf meinen USB-Stick Y kopiert werden.

Das heißt alle Zahlen als bsp: 4500,4501,4502,4503,4504,..,5001,5002,5003,5004,...,5100,5101,... usw. auf USB Y kopiert werden. Nach oben hinaus wäre in diesem Fall kein problem.

Bei USB X darf es jedoch nur bis 4999 gehen.

Ich hoffe ich habe mich verständlich ausgedrückt.
Mitglied: weaslflink
weaslflink 17.01.2012 um 09:43:28 Uhr
Goto Top
Für was steht denn das in Zeile 14 "exit /b" ? Bisher hat das Script nämlich einwandfrei funktioniert.
Mitglied: weaslflink
weaslflink 17.01.2012 um 10:56:45 Uhr
Goto Top
Also ich habe mir das ungefähr so gedacht:

set /a =0 - 4999

oder geht das nicht und ich müsste es so machen ?

set /a=0,1,2,3,4,5,6,7,8,9,10,11,...

wird dann dabei nur die Zahlen vor dem Unterstrich beachtet oder alle Zahlen in dem Dateinamen ?
Mitglied: bastla
bastla 17.01.2012 um 12:25:47 Uhr
Goto Top
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:
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
Wenn tatsächlich nur eine Unterscheidung "unter 4500" und "ab 4500" zu treffen ist, lässt sich das noch auf
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
Zum Testen sind hier wieder "Sicherheits-echos" 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]
Mitglied: weaslflink
weaslflink 17.01.2012 um 12:54:03 Uhr
Goto Top
Danke für deine Hilfe, bin leider noch nicht so gut bewandert in Batch deswegen habe ich den Ansatz von dir nicht gesehen und konnte ihn somit nicht ummodellieren.
Aber hatte eben den "ahhh stimmt ja ... ich idiot" Moment als du in deinem letzten post darauf hingewiesen hast.

jetzt noch eine Frage in Zeile 12
if %%a geq %Nr1% ( 

was bedeutet dort das "%Nr1%" bezieht sich das nicht auf eine angegeben "set-variable" bzw könnte man das nicht weglassen weil man doch schon damit besagt
"wenn a (4500) größer gleich ist dann bitte auf ort X kopieren wenn dem nicht so ist dann auf Ort Y"
Mitglied: weaslflink
weaslflink 17.01.2012 um 13:04:23 Uhr
Goto Top
habe es getestet. bekomme jedoch leider einen Syntaxfehler

C:\Users\pzhqch>echo on   & setlocal

C:\Users\pzhqch>echo Dateien werden kopiert. Das Fenster schliesst auotmatisch !

Dateien werden kopiert. Das Fenster schliesst auotmatisch !

C:\Users\pzhqch>set "SrcDir=C:\Users\pzhqch\Documents\MyScans"  

C:\Users\pzhqch>set "FileType=pdf"  

C:\Users\pzhqch>set /a Grenze=4500

C:\Users\pzhqch>set "Dest1=C:\Users\pzhqch\Documents\MyScans\test1"  

C:\Users\pzhqch>set "Dest2=C:\Users\pzhqch\Documents\MyScans\test2"  
Syntaxfehler.
C:\Users\pzhqch>if %a geq (
Mitglied: bastla
bastla 17.01.2012 um 13:26:12 Uhr
Goto Top
Hallo weaslflink!

Leider hatte ich es wieder mal gut gemeint und im zweiten Batch den Variablennamen %Nr1% auf %Grenze% verändert - allerdings nur an einer Stelle face-sad - daher bitte Zeile 12 auf
if %%a geq %Grenze% (
korrigieren ...

Grüße
bastla
Mitglied: weaslflink
weaslflink 17.01.2012 um 13:52:03 Uhr
Goto Top
*freu* immerhin hab ich schon mal bemerkt das was nicht stimmt :-P

neu getestet ---> nächster fehler

C:\Users\pzhqch>set "FileType=pdf"  

C:\Users\pzhqch>set /a Grenze=4500
"0" kann syntaktisch an dieser Stelle nicht verarbeitet werden.  
C:\Users\pzhqch>  if  gtr 0 ren "" "()"  

Worauf bezieht sich den hierbei das 0?ich versuche es schon die ganze Zeit in dem Code findenface-sad
Mitglied: bastla
bastla 17.01.2012 um 16:03:30 Uhr
Goto Top
Hallo weaslflink!

Lass am Ende der Zielangaben (also X:\ und Y:\) jeweils den "\" weg - ich ändere das oben auch entsprechend ...

Grüße
bastla
Mitglied: weaslflink
weaslflink 18.01.2012 um 08:39:38 Uhr
Goto Top
Morgen Bastla,

an dieser Stelle nochmal vielen Dank für deine Hilfe.

Habe wie du gesagt hast es geändert jedoch besteht weiterhin der Fehler face-sad

Hier der komplette Code:

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"  


exit /b
Mitglied: icsat
icsat 18.01.2012 um 10:26:57 Uhr
Goto Top
Hallo weaslflink,

der Fehler bezieht sich auf Zeile 29.

Ich habe das Problem zwar noch nicht wirklich erkannt, aber ...
... die Variable "NumFiles" ist nicht definiert
... die übergebene Datei scheint auch nicht i.O. zu sein

Prüf doch mal, was in Zeile 12 an die SubRoutine übergeben wird.


Gruß icsAT
Mitglied: weaslflink
weaslflink 18.01.2012 um 10:49:55 Uhr
Goto Top
Hallo icsAT,

Numfiles ist doch in Zeile 23 definiert mit "set /a NumFiles=0"

:RenOldVersion soll überprüfen ob die Dateien, welche kopiert werden, in dem Zielordner schon vorhanden sind und an diese am ende des Namens ein (1), (2), (3), ... dranhängen soll.

Hat vorher einwandfrei geklappt nur leider jetzt nicht mehr.

Was meinst du denn mit "... die übergebene Datei scheint auch nicht i.O. zu sein´" ?
Mitglied: icsat
icsat 18.01.2012 um 11:28:06 Uhr
Goto Top
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:
: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
Mitglied: weaslflink
weaslflink 18.01.2012 um 11:57:29 Uhr
Goto Top
Hi icsAT,

habe wie du mir gesagt hast :RenOldVersion verändert. (copy - past)

hier was mit die console ausgibt. Was ich noch dazu sagen möchte ist das ich die Batch datei in der console öffne also mit

start %userprofile%\Documents\MyScans\test3.bat


C:\Users\pzhqch>echo on   & setlocal

C:\Users\pzhqch>echo Dateien werden kopiert. Das Fenster schliesst auotmatisch !

Dateien werden kopiert. Das Fenster schliesst auotmatisch !

C:\Users\pzhqch>set "SrcDir=C:\Users\pzhqch\Documents\MyScans"  

C:\Users\pzhqch>set "Dest1=G:"  

C:\Users\pzhqch>set "Dest2=F:"  

C:\Users\pzhqch>set "FileType=pdf"  

C:\Users\pzhqch>set /a Grenze=4500
"0" kann syntaktisch an dieser Stelle nicht verarbeitet werden.  
C:\Users\pzhqch>   if  gtr 0 ren "" "()"  

Noch eine Frage: Worauf bezieht sich denn das "%%c" ?

Mir kommt es so vor als würde er deine Echo's einfach überspringen.

Wenn ich die Batch via Doppelklick öffne schließt sie Sich direkt wieder. Deshalb öffne ich es über die console.
Mitglied: icsat
icsat 18.01.2012 um 12:48:37 Uhr
Goto Top
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 face-wink


Gruß icsAT
Mitglied: weaslflink
weaslflink 18.01.2012 um 13:18:42 Uhr
Goto Top
Hi IcsAT,

leider bin ich nicht soooo gut in batch das mir das so schnell klar wird bzw ich das sehe wo ich die ")" einfügen muss.

Wärest du so nett und könntest den richtigen Code mit den ")" hier posten ?

Vielen Dank !

Gruß weaslflink
Mitglied: icsat
icsat 18.01.2012 um 13:30:33 Uhr
Goto Top
Hallo weaslflink,

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
Mitglied: weaslflink
weaslflink 18.01.2012 um 14:10:37 Uhr
Goto Top
ah super face-smile

Es funktioniert.

Hiebei geht ein großer Dank an Bastla und icsAT für eure super Hilfe.

Danke Danke Danke !
Mitglied: bastla
bastla 18.01.2012 um 14:38:41 Uhr
Goto Top
Hallo icsAT!

Danke für's Aufräumen ... face-smile

Grüße
bastla
Mitglied: icsat
icsat 18.01.2012 um 15:09:42 Uhr
Goto Top
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 face-wink


Gruß icsAT