minicoop
Goto Top

Dateien umbennen falls nummer schon vorhanden..

hallo,

ich bräuchte hilfe bei folgendem scenario:
annahme:
im verzeichnis c:\temp\
liegen dateien mit 000_xyz.dat wobei xyz im grunde fortlaufende nummern sind.
diese möchte ich in das verzeichnis c:\archiv verschieben.
bis hier ist es ja kein problem.
wenn aber in c:\archiv schon die datei existiert, soll die zu verschiebenden dateien hintendrangehängt werden.
also wenn zb im archiv die dateien von 000_000.dat bis 000_123.dat existieren,
und in c:\temp\ dateien mit 000_000.dat bis 000_009.dat liegen, sollen diese ab 000_124.dat anfangen und danach dorthin verschoben werden.

wäre für eure hilfe sehr dankbar.

gruss


[Edit Biber] ich hasse Umbennungen... nein, ich benn das jetzt nicht um...*grmpfff* [/Edit]

Content-Key: 79431

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

Printed on: April 25, 2024 at 07:04 o'clock

Member: bastla
bastla Jan 29, 2008 at 13:26:39 (UTC)
Goto Top
Hallo minicoop!

Etwa so:
@echo off & setlocal
set "Source=C:\temp"  
set "Target=C:\archiv"  
set Prefix=000
set Delim=_
set Ext=.dat

for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Target%\%Prefix%%Delim%*%Ext%"') do set N=%%i  
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Source%\%Prefix%%Delim%*%Ext%"') do call :ProcessFile %%i  
goto :eof

:ProcessFile
set /a N+=1
set "No=00000%N%"  
move "%Source%\%Prefix%%Delim%%1%Ext%" "%Target%\%Prefix%%Delim%%No:~-3%%Ext%"  
Anmerkung: Die Stellenanzahl (3) für die laufende Nummer habe ich (in der letzten Zeile) konstant eingetragen, um nicht "delayedexpansion" verwenden zu müssen.

Grüße
bastla
Member: Biber
Biber Jan 29, 2008 at 13:41:30 (UTC)
Goto Top
Moin bastla,

[Fussnote]

Einen Unterschied bzw. einen Grund zur Unterscheidung von
..
set Prefix=000
set Delim=_
..
...gibt es aber nicht, oder?

set "Prefix=000_"  
...wäre doch viel ressourcen- und damit klimaschonender. Oder übersehe ich etwas?
Member: bastla
bastla Jan 29, 2008 at 13:50:41 (UTC)
Goto Top
@Biber

Einen Unterschied bzw. einen Grund zur Unterscheidung von ...gibt es aber nicht, oder?
Da ich %Delim% in den Schleifen verwende, eigentlich doch - insofern vielleicht eher
set Part=000
set Delim=_

set Prefix=%Part%%Delim%

Grüße
bastla
Member: minicoop
minicoop Jan 29, 2008 at 14:30:10 (UTC)
Goto Top
hallo bastla,

sieht gut aus. vielen dank an euch alle.
bau jetzt noch ein wenig drumherum und bin dann fertig.

gruss
Member: minicoop
minicoop Jan 29, 2008 at 15:51:59 (UTC)
Goto Top
hallo bastla,

korrektur.
irgendwas scheint bei mir nicht ganz zu stimmen..

ist im target verzeichnis nichts drin, werden die dateien alle rübergemoved.
nehme ich dann meine 4 dateien aus dem target verzeichnis und kopiere sie nochmal ins source
verzeichnis und führe das script erneut aus, dann moved er mir die dateien korrekt rüber.
im ziel verzeichnis sind dann 000_001.dat bis 000_008.dat
nehme ich dann die acht dateien und kopier sie erneut ins source verzeichnis und führe das script aus,
werden die vorhandenen acht dateien dann überbügelt, nicht "hintendrangehängt"
komisch..
weisst du da einen rat ?
Member: bastla
bastla Jan 29, 2008 at 16:06:21 (UTC)
Goto Top
Hallo minicoop!

Ändere die Zeile
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Target%\%Prefix%%Delim%*%Ext%"') do set N=%%i  
auf die folgenden Zeilen:
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Target%\%Prefix%%Delim%*%Ext%" 2^>nul') do set N=1%%i  
set /a N-=1000
if %N% lss 0 set N=0
Erklärung: MS hatte die Königsidee, Oktalzahlen mit dem Präfix "0" zu versehen - daher werden "000" bis "007" richtig interpretiert, "008" aber nicht mehr. Das Ergebnis: Die höchste Zahl wird mit 0 ermittelt, und daher beginnt die Zählung von vorne und die vorhandenen Dateien werden überschrieben.

Solltest Du irgendwann mit dreistelligen Nummern nicht mehr auskommen, müsstest Du auch die Zeile
set /a N-=1000
auf die höhere Stellenanzahl anpassen.

Grüße
bastla
Member: miniversum
miniversum Jan 29, 2008 at 16:54:35 (UTC)
Goto Top
Erklärung: MS hatte die Königsidee, Oktalzahlen mit dem Präfix "0" zu versehen
Ich glaub diese Idee stamt nicht von MS ;) . Das wurde denk ich mal eher aus Kompartiblitätsgründen übernommen.
Member: minicoop
minicoop Jan 29, 2008 at 17:02:24 (UTC)
Goto Top
hallo bastla,

vielen dank, jetzt sieht es besser aus.
hab jetzt nur noch ein letztes anliegen.
wenn ich
set "Source=C:\temp" ändere auf z.b.
set "Source=C:\Program Files" findet das verzeichnis nicht mehr.
war eigentlich immer der meinung, wenn ich das verzeichnis in hochkommata angebe, kann man in batches damit arbeiten.
habe dann gedacht ich arbeite mit dem kurznamen, aber der geht auch nicht bei mir.
ich mach jetzt feierabend.
bis morgen,

gruss
nedim
Member: bastla
bastla Jan 29, 2008 at 17:13:20 (UTC)
Goto Top
Hallo minicoop!

set "Source=C:\Program Files" findet das verzeichnis nicht mehr.
Sollte eigentlich kein Problem sein - bei mir funktioniert's (mit dem von mir geposteten Code). Stell doch bitte Deine momentane Batchversion herein ...

@miniversum
Ich glaub diese Idee stamt nicht von MS ;)
Na dann geht's mir doch gleich wesentlich besser damit ...

Grüße
bastla
Member: minicoop
minicoop Jan 30, 2008 at 10:15:36 (UTC)
Goto Top
Guten Morgen,

anbei die batch..
wie gesagt, wenn ich meine quelle ändere, läuft sie durch. nehme ich meinen usb stick, geht nix..
@echo on & setlocal

REM Variablen setzen

set "quelle=E:\externe Daten"  
set "temp=C:\umbennen"  
set "ziel=C:\Archiv"  
set Prefix=000
set Delim=_
set Ext=.dat

REM Prüfung ob Ziel überhaupt vorhanden
if exist %quelle%\*%EXT% GOTO :LOS
GOTO :eof

:LOS
REM und los ..
echo "Daten werden uebertragen.. Bitte warten"  
c:
REM Daten werden erstmal weggemoved da quelle zu langsam.
if exist "%quelle%\*%EXT%" FOR /F "usebackq eol=; tokens=1,2* delims=: " %%i in (`Time /T`) do move "%quelle%\*%EXT%" %temp%  

cd %ziel%
REM Zielverzeichnis wird angelegt wenn nicht schon existent im format YYYY\MM.YYYY\TT
if exist "%temp%\*%EXT%" FOR /F "usebackq eol=; tokens=2,3,4* delims=. " %%i in (`Date /T`) do if not exist %%k\%%j.%%k\%%i mkdir %%k\%%j.%%k\%%i  
FOR /F "usebackq eol=; tokens=2,3,4* delims=. " %%i in (`Date /T`) do cd %%k\%%j.%%k\%%i  
FOR /F "usebackq eol=; tokens=2,3,4* delims=. " %%i in (`Date /T`) do set ziel1=%%k\%%j.%%k\%%i  

for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%ZIEL%\%ZIEL1%\%Prefix%%Delim%*%Ext%" 2^>nul') do set N=1%%i  
set /a N-=1000
if %N% lss 0 set N=0
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%temp%\%Prefix%%Delim%*%Ext%"') do call :ProcessFile %%i  
goto :eof

:ProcessFile
set /a N+=1
set "No=00000%N%"  
move "%temp%\%Prefix%%Delim%%1%Ext%" "%ziel%\%ziel1%\%Prefix%%Delim%%No:~-3%%Ext%"  
Gruss
Nedim
Member: Biber
Biber Jan 30, 2008 at 10:27:40 (UTC)
Goto Top
Moin Nedim,

schau Dir mal am CMD-Prompt die Hilfen zu "cd" und "PopD/PushD" jeweils mit "help cd" bzw "help pushd" etc. an.

Und ändere dann die Zeile
cd %ziel%
in
PushD "%ziel%"
...oder wenigstens (zweite Wahl) in ...
cd /d %ziel%

Aber versuch erst zu verstehen, was der Unterschied ist... sonst noch mal nachfragen. face-wink

Grüße
Biber
Member: minicoop
minicoop Jan 30, 2008 at 14:10:50 (UTC)
Goto Top
sorry biber,
hat ein wenig länger gedauert.
das mit der erweiterten shell war mir noch nicht bekannt..
muss doch gleich mal danach googlen was damit noch alles geht..
script funktioniert jetzt einwandfrei, bis auf die abfrage

REM Prüfung ob Ziel überhaupt vorhanden
if exist %quelle%\*%EXT% GOTO :LOS
GOTO :eof
das mag er irgendwie nicht so wirklich.
habe das jetzt weggemacht und er rennt durch.

wenn ich jetzt irgendwann auf 000_wxyz.dat gehen würde,
müsste ich set /a N-=1000 anpassen wie bastla geschrieben hat ?

Gruss
Nedim
Member: bastla
bastla Jan 30, 2008 at 14:32:55 (UTC)
Goto Top
Hallo minicoop!

wenn ich jetzt irgendwann auf 000_wxyz.dat gehen würde, müsste ich set /a N-=1000 anpassen
Soferne Du mit "wxyz" vierstellige Nummern meinst: ja. Anzupassen wäre die "set"-Zeile auf
set /a N-=10000
und die "move"-Zeile wäre dann
move "%temp%\%Prefix%%Delim%%1%Ext%" "%ziel%\%ziel1%\%Prefix%%Delim%%No:~-4%%Ext%"  
die abfrage ... REM Prüfung ob Ziel überhaupt vorhanden
... hätte ich zwar umgekehrt formuliert, also
if not exist "%Quelle%\*%Ext%" goto :eof  
aber wenn's nicht an den fehlenden Anführungszeichen gelegen sein sollte, wüsste ich im Moment auch nicht, wo's klemmt ...

Du könntest aber einmal ein "echo" vor die Zeile schreiben - dann wird sie nur angezeigt, und Du siehst hoffentlich, woran es scheitert.

Grüße
bastla
Member: minicoop
minicoop Jan 30, 2008 at 15:00:54 (UTC)
Goto Top
Hallo bastla,

das passt jetzt alles.
vielen dank für eure hilfe.
ich schliess dann mal den vorfall.

Gruss
Nedim