Egyszerű bat fájl csak másodjára fut le

Sziasztok!
Adott egy egyszerű batch fájl.
Egy egyszerű dos-os program napi mentését, ami c:\dokk2014\nyolcjegyűszám.ddb\ment könyvtárba csinál mentést .arj fájlba és azt minden mentéskor felülírja, átmásolja a c:\dokk2014\mentes könyvtárba, a fájlnév elé beszúrja a könyvtárneve.ddb-t, utána meg dátumot és időt.
Sajnos csak így lehet megőrizni a napi mentés állományaimat (nem akarom túlbonyolítani, könyvelőknek lesz, nekem kell majd úgyis visszaállítani)
A fájl tartalma:

@echo off
For /d %%a IN (*.DDB) DO (
cd %%a
set Source=C:\DOKK2014\"%%a"\MENT
set Target=C:\DOKK2014\MENTES
FOR /f "tokens=1-8 delims=/.:- " %%A in ("%date% %time%") DO (
SET Month=%%B
SET Day=%%C
SET Year=%%D
SET Hours=%%E
SET Minutes=%%F
SET Seconds=%%G
SET All=%%B-%%C-%%D_%%E-%%F-%%G
)
FOR %%i IN ("%Source%\*.arj") DO ^
COPY "%%i" "%Target%\%%a%%~Ni %All%.arj"
cd ..
)

De ez elsőre nem fut le, csak másodikra. Mi lehet a baj?

Hozzászólások

Az a probléma, hogy a for-on belül beállitott ENVV csak a for végén kerül tárolásra. Ezért első futásnál a külső forból a source,target,all nem él a belső/utolsó for-ban.
Delayed expansion kell neked, valahogy igy:

setlocal enabledelayedexpansion
for /d %%a in (*.ddb) do (
cd %%a
set source=c:\dokk2014\"%%a"\ment
set target=c:\dokk2014\mentes
for /f "tokens=1-8 delims=/.:- " %%a in ("%date% %time%") do (
set month=%%b
set day=%%c
set year=%%d
set hours=%%e
set minutes=%%f
set seconds=%%g
set all=%%b-%%c-%%d_%%e-%%f-%%g
)
for %%i in ("!source!\*.arj") do (
copy "%%i" "!target!\%%a%%~ni !all!.arj"
)
cd ..
)

Egyébként én ha batch-ben ENVV-kkel dolgozok a végén mindig kinullázom őket, hogy egyrészt ne szemetelje a környezetet, másrészt determinisztikus legyen a futása.

Működik? Nem működik?
Ennyit azért illene visszairni, ha már valaki segiteni próbál.

Lehet, hogy másoknak is hasznos info lesz később, ha hasonló gondjuk akad.

(vagy ez csak engem idegesit amikor valami problémára megoldást keresek és a forumokban nem irják vissza az eredményt és próbálhatom ki, hogy az volt-e a megoldás vagy kereshetek tovább)

Nem is az illem miatt, hanem legyen már ott egy topic végén, hogy a javasolt megoldás bevált vagy nem és akkor az évek múlva gugliról idetévedő ember egyből látja, hogy van-e értelme megpróbálni a saját feladatához heggeszteni a javasolt megoldást vagy nem.

(És ha már segitségkérési etikett, pl. sokat segitene a segitőkön, ha ilyen esetben pl. lenne egy letölthető file, benne a könyvtár struktúrával, teszt fileokkal, hogy ne arra pazarolja az ember az idejét, hogy egy hosszú szöveges leirás alapján próbálja kialakitani a teszt környezetet, de ez már a nyafogás témaköre :))

Windows 7-et. Két batch fájlból loptam össze tulajdonképpen a cuccot -már ha lehet lopásnak nevezni, ha interneten közzétett okosságokat használtam- az ott felhasznált elnevezések lehet hogy régebbiek. De miből lehet arra következtetni a változónevekből, hogy régebbi Windows-t használok?
Tulajdonképpen mikor beraktam ezt:
setlocal enabledelayedexpansion
utána már másodjára sem futott le, sőt sokadjára sem, csak nem vettem észre.
Mindegy, csak reméltem, hátha valaki elsőre vágja, hogy mi a gond, de semmi gond, ne törjétek rajta magatokat, de ha valaki nagyon akarja, akkor csinálok egy tesztkörnyezetet, hogy lássatok egy modern önkormányzati szoftvert :-(
Egyébként ez a batch fájl ezt csinálja: felhasználó elindítja a parancssort, belép a \dokk2014 könyvtárba, lefuttatja kétszer a mentes.bat-ot, és négy(de lehetne több is) adatkönyvtárból a mentett fájlokat átmásolja a \dokk2014\mentes könyvtárba úgy, hogy hozzáteszi, hogy melyik adatkönyvtárból másolta, és mikor (dátum, idő) hozzáfűzéssel.
Ha ezt nem csinálom meg, akkor képzeljétek el a felhasználókat, grafikus felületen: kb 10 perc.

Kérdéshez off meg workaround :) :

Pld. a rar tud olyat (-ag kapcsoló), hogy a dátum segítségével generál archivumnevet (naponta többet is lehet). Ha nem vagy ellene az újratömörítésnek, akkor egy sorból megoldható a probléma és nem kell batch-ban bűvészkedni. Bár tudom, ez nem olyan elegáns, meg nincs kihívás :) stb. Én is használok hasonló, megőrzendő minennapi mentésre ütemezett rar-t, egy sor :)

Azt sajnos nem tudom, hogy az arj tud-e ilyet (most nincs is közelemben). Meg ha tudna is, nem tudom, hogy a 8 karakternél hosszabb filenevekkel mit kezdene, így tulajdonképpen nincs sok haszna a hozzászólásomnak, de azért meghagyom :)

Ne kattints ide!

ARJ? 2014-ben? Ez most halál komoly?
Én utoljára kb. a 90-es évek közepén használtam... :D

Mi lehet a baj?
Passz, de a te kódod nálam is csak másodikra fut le, ráadásul ha több arj van a \ment könyvtárban, volt hogy nem mindet másolta. (azt nem írtad, hogy csak 1 db arj van-e a könyvtárban)

Próbáld ki az alábbit, nálam működik magyar nyelvű W7x64 Ultimate alól tesztelve:

@echo off
setlocal EnableDelayedExpansion

set t=%time:~0,2%-%time:~3,2%-%time:~6,2%
set t=%t: =0%
set d=%date:~5,2%-%date:~8,2%-%date:~2,2%
set timestamp=%d%_%t%
set target=C:\dokk2014\mentes

pushd c:\dokk2014
for /d %%a in (*.ddb) do (
pushd c:\dokk2014\%%a\ment
for /f %%b in ('dir /b *.arj') do (
copy %%b "%target%\%%a%%~Nb %timestamp%.arj"
)
popd
)

popd
endlocal

A timestampet ízlés szerint módosítsd.

Pont az a lényeg, hogy 1 arj van, ráadásul, ha két nap csinálok egy-egy mentést, akkor az első napi mentést felülvágja a második napi mentés, más fájlnévvel, amiben benne van a napi dátum is valamilyen módon. Holnap megpróbálom a te megoldásodat is, ha már voltál szíves válaszolni!