Batch Datei mit Variablen

Hallo Experten,
ich hab da ein Problem :smile:

Ich möchte eine vorhandene Datei kopieren und dabei den Namen hochzählen.

Also Quelldatei heißt KL_.dwg
und soll kopiert werden und dabei umbenannt in KL_1.dwg KL_2.dwg KL_3.dwg usw. bis KL_100.dwg heissen

(*.dwg ist eine Zeichnungsdatei von AutoCAD z.B)

Ich dachte da an eine Simple Batch Datei. eine VBS käme auch in Frage, auf jeden Fall mit allgemeinen WindowsXP Mitteln da ich keine Software installieren kann (Firmen PC)

Ich hab mich versucht und bin bis jetzt gescheitert.

Mein Lösungsansatz (aber auch wirklich nur ein Ansatz):
copy KL.dwg KL_%1%.dwg
rem for /L %1 IN (1,1,10) DO copy KL.dwg KL_%1%.dwg
ren KL.dwg KL_%1%.dwg

Bitte helft mir sonst sitz ich hier Stundenlang mit kopieren/einfügen/umbenennen

Vielen Dank im vorraus!

Hi,

also ähnlich hat das bei mir auch mal angefangen, und hab dann
diese Batch-Wurst fabriziert…

Also das funktioniert auch alles (vielleicht nicht der
kompakteste Code)… aber falls dann doch lieber ne GUI
willst:
http://toolsandmore.de/Central/Produkte/Software/Dat…

REM _____________________INITIALISIERUNG_________________________
title RENAMER
@echo off
echo.>log.txt
setlocal enabledelayedexpansion
set /a c=0
set /a zeros=0

REM__________________________M E N Ü_____________________________
:menu
cls
echo R E N A M E R
echo.
echo 1. String vorne einfuegen
echo 2. Nummer vorne einfuegen
echo.
set /p auswahl=Deine Auswahl:
if not %auswahl%==1 if not %auswahl%==2 if not %auswahl%==3 goto menu

cls
echo Der Aufbau des Dateinamens sieht dann so aus:
goto %Auswahl%

:1
echo [String] + [Dateiname]
echo.
echo.
echo.
call:get Kriterium
call:get Vorne
goto start

:2
echo [String] + [Nummer] + [String] + [Dateiname]
echo.
echo.
echo.
call:get Kriterium
call:get Vorne optional
call:get Nummer
call:get Schritt
call:get Zeros
call:get Hinten optional
set /a schritt=%schritt%
set /a nummer=%nummer%
set /a zeros=%zeros%
goto start

:3
goto start

_________________METHODENBEREICH FUNKTIONEN_______________________
:get
set aktuell=%1
if %1==Kriterium set Ausgabe=Bitte geben sie ein Datei-Auswahlkriterium ein (zb * oder *.mp3):
if %1==Vorne set Ausgabe=Bitte geben sie vorne anzuhaengenden String an:
if %1==Nummer set Ausgabe=Bitte geben sie eine anzuhaengende Nummer an:
if %1==Schritt set Ausgabe=In was fuer Schritten soll gezaehlt werden?:
if %1==Zeros set Ausgabe=Auf wieviel Stellen soll mit Nullen aufgefüllt werden?(-1 = Autodetect):
if %1==Hinten set Ausgabe=Bitte geben sie einen anzuhaengenden String an:
set /p %aktuell%=%Ausgabe%
if not „%2“==„optional“ if „!%aktuell%!“=="" call:get %1
echo.
goto:eof

rem leading zeros erstellen
:lzero
set znum=%nummer%
set /a g=0
:genznum
call:length znum
set /a znuml=%znuml%
if %zeros% leq %znuml% goto endgenzn
set znum=0%znum%
set /a g=!g!+1
goto genznum
:endgenzn
goto:eof

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _

rem länge eines strings zurückgeben
:length
set name=%1
set wstr=!%name%!
set /a %name%l=0
:sub
if „!wstr!“=="" goto endsub
set wstr=!wstr:~0,-1!
set /a %name%l=!%name%l!+1
goto sub
:endsub
goto:eof

_ _ _ _ _ __ _ _ _ _ _ _ _ _ _

rem benötigte zeros berechnen
:zeroneeded
set /a lastindex=%schritt%*%max%
set /a lastindex=%lastindex%+%nummer%
set lastindex=%lastindex%
call:length lastindex
set /a zeros=%lastindexl%-1
goto:eof

__________________________M A I N_________________________________
:start

rem ___Dateinamen einzeln abspeichern
for %%i in (%kriterium%) do (
set nameA!c!=%%i
set /a c=!c!+1
)

rem ___Anzahl der Dateien (benötigt zum leading zero berechnen)
set /a max=%c%
if %zeros%==-1 call:zeroneeded

set /a c=0

rem ___Umbennungsschleife
:schleife
if not zeros==0 call:lzero

set nameB!c!=%vorne%%znum%%hinten%!nameA%c%!

echo %c% „!nameA%c%!“ „!nameB%c%!“ >> log.txt
echo %c% „!nameA%c%!“ „!nameB%c%!“
ren „!nameA%c%!“ „!nameB%c%!“

if not „%nummer%“=="" set /a nummer=!nummer!+%schritt%

set /a c=!c!+1
if %max% leq %c% goto:end
goto schleife

:end
pause

HI,
ganz schön viel für den Anfang.
Mal abgesehen das ich nach der 3ten Zeile nicht mehr mitkomme *g*
Naja ich habs kopiert und gestartet aber irgednwie will das nicht so. Was ist mit String am Anfang und ende gemeint?

Kannst mir einen Tipp geben bzw sagen was von deinem Quelltext „über“ ist damit ich meij Problem lösen kann.

Trotzdem bzw. erstmal Vielen dank für deine Mühe. Auch wenn ich irgendwie nicht weiter komme.

Kennt jemand ne gute Seite mit Tipps und Infos für Batch Dateien. Bei der Google komm ich irgendwie nicht weiter.

Danke

hi

Mein Lösungsansatz (aber auch wirklich nur ein Ansatz):
copy KL.dwg KL_%1%.dwg
rem for /L %1 IN (1,1,10) DO copy KL.dwg KL_%1%.dwg
ren KL.dwg KL_%1%.dwg

was war an deinem lösungsansatz falsch?? das mit der for-schleife müsste doch klappen. ich würde halt nur in einer batch-datei keine nummerischen variablen verwenden, da die normalwerweise für die parameter der batch-datei reserviert sind.

insofern hätte ein

@echo off
for /L %%i in (1,1,100) do copy KL_.dwg KL_%%i.dwg

doch funktionieren sollen.

lg
erwin

Hallo,

ich hätte da auch einen Vorschlag:

---------- SHNIPP: savevers.bat ------------
@echo off
:: Alle Variablen nur als Skriptvariablen ansehen
setlocal
:: Hilfsvariable
set x=###
:: Befehlserweiterungen werden benoetigt
set errorlevel=
if „“ == „%errorlevel%“ goto noexc
:: verzoegerte Variablenexpansion wird benoetigt
if NOT „%x%“ == „!x!“ goto nodlx
:: Mindesttens 1 Parameter ist Pflicht
if „%1“ == „“ goto usage
:: Original File
set of=%1
if not exist %of% (
echo FEHLER^^!^^!^^! Die Datei „%of%“ exisitiert nicht
exit /b 1
)
:: spezielle Optionen fuer copy werden als Folgeparameter uebergeben
:getcopt
set copt=%2
shift /2
if „“ NEQ „%2“ goto getcopt
:: der Name der Datei ohne Endung
set fn=%~n1
:: Endung der Datei
set ex=%~x1
:: Search Files = Bezeichnung (mit Platzhalter *) der moeglichen
:: vorhandenen Kopien der Datei %fn%
:: __ ist ein Trenner damit bei t.txt nur Kopien der Art t__10__.txt
:: gefunden werden und nicht txt.txt
set sf=%f%__*__%e%
:: Laenge des Dateinamens
call :length lf %fn%
:: Position um Maske „__“ verändern
set /a lf=%lf%+2
:: Letzte Kopie suchen
( for /f „usebackq“ %%l in ( dir /b /o-n %sf% ) do if „###“=="!x!" call :sx lfn %%l ) >nul 2>&1
for /f %%l in ( „%lfn%“ ) do set lfn=%%~nl
:: letzte vergebene Nummer ermitteln
call :substr nu %lfn% %lf%
if „“ EQU „%lfn%“ (set nu=0) else (set nu=%nu:~0,-2%)
:: naechste Kopienummer
set /a nu=%nu%+1
:: Namen der neuen Kopie zusammenstellen
set zf=%f%__%nu%__%ex%
echo Name der Zieldatei = %zf%
:: jetzt noch kopieren
copy %copt% %of% %zf%
goto :eof

:: „Funktion“ sx setzt die Hilfsvariable x auf einen Wert ### und die
:: in %1 uebergebene Variable auf den Wert von %2
:sx
if „“ EQU „%1“ call :stuck_out_tongue:armerr sx 1
if „“ EQU „%2“ call :stuck_out_tongue:armerr sx 2
set x=xxx
set %1=%2
exit /b 0

:: „Funktion“ length ermittelt die Laenge der Zeichenkette in %2
:: und besetzt die Variable aus %1 mit dem Ergenis
:length
if „“ EQU „%1“ call :stuck_out_tongue:armerr length 1
if „“ EQU „%2“ call :stuck_out_tongue:armerr length 2
set l=0
set str=%2
if „“ EQU „%str%“ goto retlen
:sublen
set /a l=%l%+1
set str=%str:~0,-1%
if „“ NEQ „%str%“ goto sublen
:retlen
set %1=%l%
exit /b 0

:: „Funktion“ substr schneidet aus der Zeichenkette in %2
:: %4 Zeichen ab der Poition %3 aus
:: und besetzt die Variable aus %1 mit dem Ergenis
:: Wenn %4 nicht besetzt ist dann werden alle Zeichen bis zum
:: Ende von %2 ausgeschnitten (maximal 9999)
:substr
set ergstr=
if „“ EQU „%1“ call :stuck_out_tongue:armerr substr 1
if „“ EQU „%2“ call :stuck_out_tongue:armerr substr 2
if „“ EQU „%3“ goto retsub
set var=%1
set str=%2
set sp=%3
if „“ EQU „%4“ ( set az=9999 ) else ( set az=%4 )
:ignch
if %sp% EQU 0 goto getlp
set str=%str:~1%
set /a sp=%sp%-1
goto ignch
:getlp
if „“ EQU „%str%“ goto retsub
if %az% EQU 0 goto retsub
set ergstr=%ergstr%%str:~0,1%
set str=%str:~1%
set /a az=%az%-1
goto getlp
:retsub
set %var%=%ergstr%
exit /b 0

:stuck_out_tongue:armerr
echo Fehler bei %1 fuer Parameter %2
goto eof

:nodlx
echo Keine Verzögerte Variablenerweiterung
goto eof

:noexc
echo CMD-Befehlserweiterungen nicht aktiv
goto eof

:usage
echo Aufruf: %0 ^ [^]
echo Beispiel 1: %0 t.txt
echo Beispiel 2: %0 t.txt /d
goto eof

:eof
endlocal
---------- SHNAPP: savevers.bat ------------

Das Skript benötigt sowohl die Befehlserweiterungen, als auch die „verzögerte Variablenerweiterung“ von cmd. D.h. es funktioniet nur wenn cmd mittels „cmd /v:on /e:on“ gestartet wurde oder die entsprechenden Einträge in der Registry gesetzt sind:

In „HKEY_CURRENT_USER\Software\Microsoft\Command Processor“ (aktueller Benutzer!) oder in „HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor“ (für alle Benutzer!) die DWORD-Einträge „EanableExtensions“ und „DelayedExpansion“ auf den Wert 1 setzen bzw. mit diesem Wert anlegen.

Nach dem Kopieren des Skripts nicht vergessen die Leerzeichen vor den Lables zu löschen (Bsp: " :xs" -> „:xs“).

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

vielen Dank für deine Mühe! Das Problem ist halt das ich nicht in die Reg komme, da Firmen PC und sehr beschränkte Rechte.

Trotzdem Danke :smile:

Hi,
SUPER vielen Dank es funktioniert, es lag an der blöden varibel %1.

Warum denn eigentlich 2x mal das Prozentzeichen?

Vielen Dank nochmal

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi

Warum denn eigentlich 2x mal das Prozentzeichen?

warum ein backslash als pfadtrenner und nicht slash wie alle anderen os auch? warum die 640 kb grenze im ms dos? warum laufwerksbuchstaben und nicht sinnvolle pfade? warum, warum, warum…

ich denke mal, das problem liegt daran, dass irgendein programmierer eine idee hat, von der er glaubt, dass sie besonders gut ist. er hat zuwenig kollegen, die von der sache ahnung haben und die ihm einen dämpfer geben könnten. also wird das ganze ausgeliefert. wenn dann die ersten negativen reaktionen kommen, weil die anwender sofort merken, dass das ganze suboptimal ist, muss die kompatibilität gewahrt werden - und schon ist ein neues kapitel im buch der dummheiten eröffnet…

lerne damit leben - es wird sich niemals ändern. zumindest nicht solange die leute diesen mist kaufen.

lg
erwin

Hallo,

schon mal versucht das Skript zu starten? Es sagt Dir ja, ob ihm etwas fehlt und zur Not solltest Du die DOS-Box immer noch über „START -> Ausführen“ (bzw. mittels Tastenkombination -R) und der Angabe von „cmd /e:on /v:on“ starten können.

Die Schlüssel unter HKEY_CURRENT_USER solltest Du ändern dürfen, auch wenn Dir regedit nicht zur Verfügung steht. Einfach eine reg-Datei laden, wie diese hier:------- SCHNIPP: hkcu_s_ms_cp.reg ------[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
„CompletionChar“=dword:00000009
„EnableExtensions“=dword:00000001
„DelayedExpansion“=dword:00000001
-------- SCHNAPP -----------
Abspeichern und einfach mal Doppelklicken oder in der DOS-Box „reg import hkcu_s_ms_cp.reg“ ausführen.

Die Anweisung „CompletionChar“ sorgt dafür, dass Du in der DOS-Box einen Dateinamen durch drücken der TAB-Taste vervollständigen kannst.

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin, loop,

Warum denn eigentlich 2x mal das Prozentzeichen?

damit der Interpreter die lokale Variable nicht als Parameter ansieht, mit dem Werte an die Prozedur übergeben werden. Sollte er zwar eh nicht, weil die numerisch sein müssen, aber Telaviv.

Gruß Ralf

Warum denn eigentlich 2x mal das Prozentzeichen?

Hi Loop,
k.A., ist aber schon seit Dos 3.3 so, in einer Batchdatei %%1, auf Kommandozeilenebene (Prompt) nur %1.
Gruß
Reinhard