Batch Umbennen, falls schon vorhanden

Flo89

Rear Admiral
Registriert
Mai 2007
Beiträge
5.643
Ich habe eine einfache Batch-Datei mit folgendem Inhalt:

Code:
copy C:\Pfad\Datei.end D:\Pfad\1.end

Es wird also eine Datei kopiert und bekommt dann den Namen 1. Diese Datei auf der Partition C ändert sich jedoch und soll dann erneut kopiert werden, allerdings ohne die alte zu überschreiben.

Gibt es eine Möglichkeit, die Datei dann automatisch 2.end, 3.end, und so weiter zu nennen? Oder geht das nicht mit einer Batch-Datei?
 
Code:
if exist xyz (
...hier alles rein...
)

sieh dir auch mal set und goto an, das sollte eigentlich alles reichen um es zusammenzubasteln.
 
sollte mit if exist gehen,

if not exist 1.end goto 1
if not exist 2.end goto 2
...

1:
copy datei.end 1.end
goto end

2:
copy datei.end 2.end
goto end

3...

end:
(exit)

oder wie mein Vorposter kann man auch alternativ

if not exist 1.end (
copy datei.end 1.end
goto end)

if not exist 2.end ( ...


end:

das (goto) end darf man nicht vergessen, denn er soll ja zum ende springen, falls die Datei einmal kopiert wurde, sonst würde er datei.end in 1.end 2.end etc. kopieren, falls diese nicht vorhanden sind. Falls es z. B. bis 100.end gehen soll, kann man besser mit einer Variablen arbeiten, die hochzählt.
 
Zuletzt bearbeitet:
Ok, ich hab es jetzt hinbekommen:

Code:
if not exist D:\Pfad\1.end goto 1
if not exist D:\Pfad\2.end goto 2
if not exist D:\Pfad\3.end goto 3

:1
copy C:\Pfad\Datei.end D:\Pfad\1.end
goto end

:2
copy C:\Pfad\Datei.end D:\Pfad\2.end
goto end

:3
copy C:\Pfad\Datei.end D:\Pfad\3.end
goto end

end


Falls es z. B. bis 100.end gehen soll, kann man besser mit einer Variablen arbeiten, die hochzählt.
Jap, das ist der Fall. Wie müsste meine Batch denn dann aussehen?
 
Google halt mal...
es gibt auch Schleifen-Befehle in der Batch-Programmierung.
 
ich geb dir mal nen kleinen tipp. und zwar hab ich auch mal so ein problem gehabt, bin dann auf eine kleine batch-datei gestoßen welche zahlen in den parametern übergibt und diese dann sortiert. erstmal die batch:

Code:
@echo off
set /a count=0

:loop
echo %1 > _%count%.var
set /a count=count+1
shift
if "%1" == "" goto :startSort
goto loop

:startSort
set /a total=%count%-1

:RestartSort
set /a count=0

:sortLoop
set /a next=%count%+1
call :swap %count% %next%
set /a count=count+1
if "%swapped%" == "true" goto :RestartSort
if "%count%" == "%total%" goto :output
goto :sortLoop

:swap
set /P var1="" < _%1.var
set /P var2="" < _%2.var
if /I %var1% LEQ %var2% goto noSwap
ren _%1.var _temp.var
ren _%2.var _%1.var
ren _temp.var _%2.var
set swapped=true
goto :eof

:noSwap
set swapped=
goto :eof

:output
for /L %%i in (0,1,%total%) do call :showval %%i

:cleanup
erase *.var
set next=
set offset=
set total=
set count=
set var=
set var1=
set var2=
goto :eof

:showval
type _%1.var
goto :eof

das interessante hierbei ist das (dynamische) auslesen der parameter (sprich :loop und :sortLoop). vielleicht kannst du es ja in folgendem zusammenhang machen:

Code:
set of=1
if exist %of% ( goto :loop
) else ( goto :rename )

:loop
set /a of=%of%+1
if exist %of% ( goto :loop
) else ( goto :rename )

:move
move hier\dein\pfad\datei.abc erneut\der\pfad\%of%.def

so in etwa sollte es also gehen. ob das wirklich so funktioniert weiß ich nicht, hab es bis jetzt noch nicht ausgeführt. ;) mit dem goto-befehl kannst du also eine art while-schleife basteln und damit alles ohne probleme durch gehen.
 
Der zweite Code funktioniert (nach etwas Anpassung und Flüchtigkeitsfehlerkorrektur) super:

Code:
set of=1
if exist Ziel-Pfad\%of%.end ( goto :loop
) else ( goto :kopieren )

:loop
set /a of=%of%+1
if exist Ziel-Pfad\%of%.abc ( goto :loop
) else ( goto :kopieren )

:kopieren
copy Ursprungs-Pfad\Datei.end Ziel-Pfad\%of%.end

end

Kann ich denn erreichen, dass %of% immer vierstellig ist und links mit Nullen aufgefüllt wird?
Wenn ich in der ersten Zeile set of=0001 schreibe, funktioniert das nur beim ersten mal, die zweite Datei hat dann wieder keine Nullen und heißt nur 2.end.



Ich habe mir gerade die Beschreibung vom set-Befehl durchgelesen und eigentlich könnte ich die Dateien, die erzeugt werden, auch "%DATE% - %TIME%.end" nennen, allerdings funktioniert das nicht, weil in Time Doppelpunkte vorkommen, die in Dateinamen ja nicht vorkommen dürfen.
Kann man die Doppelpunkte vor dem Erzeugen der Zieldatei in zum Beispiel Punkte umwandeln?


Wenn ihr noch eine der beiden Fragen beantworten könnt, wäre das perfekt. Prinzipiell funktioniert die Batch jetzt aber :)
 
Flo89 schrieb:
Kann ich denn erreichen, dass %of% immer vierstellig ist und links mit Nullen aufgefüllt wird?

das denke ich geht wieder nur mit einer schleife, indem du vor die zahl immer wieder eine 0 voransetzt.

Flo89 schrieb:
Kann man die Doppelpunkte vor dem Erzeugen der Zieldatei in zum Beispiel Punkte umwandeln?

Code:
%time:~0,2%.%time:~3,2%.%time:~6,2%

damit kannst du teile aus einem string herauslesen. also %<variablenname>:~<von zeichen>,<anzahl zeichen>%. somit könntest du so ein konstrukt wiederum in %datealt%/%timealt% speichern und dann dies einfach in den copy-befehl einfügen.

die frage hierbei ist allerdings, ob die zweite variante so klug ist. ein kopiervorgang wird ja schließlich nicht pro sekunde ein mal ausgeführt (kommt auf die dateigröße halt an), aber wenn du mehrere kleine hast, werden diese ja überschrieben. also entweder kombinierst du beide varianten, oder du machst es wie ich auf meinem desktop. ich starte immer eine batch, diese legt in einem ordner einen ordner mit datum an, dann einen mit der zeit und in diesem werden alle objekte vom desktop in diesen ordner geschoben. das finde ich persönlich komfortabler.

falls es dich interessiert:

Code:
@echo off
title Flush Desktop
C:
set dir=T:\.desktop\%date%\%time:~0,2%.%time:~3,2%.%time:~6,2%\
if not exist "%dir%" mkdir "%dir%"
move /Y "%HOMEPATH%\Desktop\*" "%dir%"
 
das denke ich geht wieder nur mit einer schleife, indem du vor die zahl immer wieder eine 0 voransetzt.
Das müsste dann ungefähr so aussehen, oder?
Code:
set of=1
if exist Pfad\%of%.end ( goto :loop
) else ( goto :test )

:loop
set /a of=%of%+1
if exist Pfad\%of%.end ( goto :loop
) else ( goto :test )

:test
if %of%[COLOR="Red"]=<10[/COLOR] ( goto :copy1
) else ( goto :copy2

:copy1
copy Pfad\Datei.end Pfad\0%of%.end

:copy2
copy Pfad\Datei.end Pfad\%of%.end

end

Wenn die Variable einstellig (also kleiner als 10) ist, soll beim Dateinamen vor die Ziffer noch eine Null vorangestellt werden. Wenn sie größer ist, soll keine 0 davor.
Das ganze dann natürlich für vier stellen anpassen.

Wie muss denn die rot markierte Stelle aussehen, damit es funktioniert?

Das nächste Problem ist, dass die Batch eine 01.end nicht als 1 erkennt :o
 
das gelbe vom ei ist das auch nicht. ;) wieder zu statisch geregelt, eine wirkliche dynamik hast du da nicht drin.

Code:
set of=1
set padn=1000
set ext=end

:padeq
if %of% lss %padn% ( goto :pad )
else ( goto :fileexists )

:pad
set /a of=0%of% (<-- weiß nicht ob das so geht)
goto :padeq

:fileexist
if exist %of%.%ext% ( goto :increment )
else ( goto :copy )

:increment
set /a of=%of%+1 (<-- ob er hier so schlau ist und aus 0001 eine 1 macht und dann um 1 erhöht, weiß ich ebenso nicht)
goto :padeq

:copy
copy Pfad\zur\Datei.end %of%.%ext%

habs allerdings nicht ausprobiert. der ablauf wäre halt folgender:

Code:
:padeq
wenn of < 100
  gehe zu :pad
  sonst gehe zu :fileexists

:pad
%of% eine 0 voransetzen
gehe zu :padeq

(durch den oberen abschnitt kommst du auf die gewünschte zahl mit vorangesetzten 0en)

:fileexists (überprüft ob die datei vorhanden ist)
wenn existiert %of%.%ext%
  gehe zu :increment (wenn ja, den zähler um 1 erhöhen)
  sonst gehe zu :copy

:increment (inkrementiert %of%)
%of% um 1 erhöhen
gehe zu :padeq (wieder mit 0en füllen)

:copy (kopiert die datei schlussendlich)
kopiere Pfad\zur\Datei.end nach %of%.%ext%

2 - 3 kleinigkeiten sind bestimmt noch fehlerhaft, aber ich denke mal so bist du auf einem guten weg.
 
Die Datei haut nicht ganz hin, die Batch führt dann folgende Schritte aus und muss mit Pause oder strg + c gestoppt werden:

Code:
C:\Dokumente und Einstellungen\TEST\Desktop>set of=1

C:\Dokumente und Einstellungen\TEST\Desktop>set padn=1000

C:\Dokumente und Einstellungen\TEST\Desktop>set ext=end

C:\Dokumente und Einstellungen\TEST\Desktop>if 1 LSS 1000 (goto :pad  )

C:\Dokumente und Einstellungen\TEST\Desktop>set /a of=01

C:\Dokumente und Einstellungen\TEST\Desktop>goto :padeq

C:\Dokumente und Einstellungen\TEST\Desktop>if 1 LSS 1000 (goto :pad  )

C:\Dokumente und Einstellungen\TEST\Desktop>set /a of=01

C:\Dokumente und Einstellungen\TEST\Desktop>goto :padeq

...

Sehe ich das richtig, dass

Code:
if %of% lss %padn% ( goto :pad )

nicht hinhaut?
 
Zuletzt bearbeitet:
scheint so als ob er das padding nicht richtig realisiert, denn es steht ja 2 mal 01 untereinander, obwohl 01 und 001 auftreten müssten. hab leider nicht so viel ahnung von batch-skripten und daher weiß ich auch nicht inwiefern zeichenketten o.ä. verknüpft werden.

bevor das zu lange dauert, das hinzubekommen, könnte man ja wirklich auf deine variante umwechseln.

Code:
if %of% lss 10 ( goto :copya )
if %of% lss 100 ( goto :copyb )
if %of% lss 1000 ( goto :copyc )
if %of% lss 10000 ( goto :copyd )

:copya
copy pfad\datei.end pfad\000%of%.end

:copyb
copy pfad\datei.end pfad\00%of%.end

:copyc
copy pfad\datei.end pfad\0%of%.end

:copyd
copy pfad\datei.end pfad\%of%.end

wobei mir das, wie schon gesagt, nicht wirklich gefallen würde. aber wenn es ohne große umstände nicht gehen sollte, könnte man es ja trotzdem so stehen lassen.
 
Zurück
Oben