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?
- 7184 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
Kösz, kipróbálom!
- A hozzászóláshoz be kell jelentkezni
Lehet egyszerűbb lett volna. Mondjuk én inkább 7zip-et szoktam használni. Amúgy egyáltalán nem a kihívás miatt csináltam, bár így valamit hozzászagolok már a batch programozáshoz.
szerk: a lentebbihez akartam hozzászólni.
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
(Már említettem, hogy generációváltás volt, és csak mi hisszük, hogy létezik illem nevű valami. Meg is kaptam, hogy marha vagyok, és nem is. Pedig de.)
- A hozzászóláshoz be kell jelentkezni
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 :))
- A hozzászóláshoz be kell jelentkezni
Nem működik!
Mindegy, lefuttatom kétszer.
- A hozzászóláshoz be kell jelentkezni
Milyen OS-t hasznalsz? Win7-et mukodik ez a megoldas, de a valtozonevekbol arra tippelek, hogy te valami korabbit hasznalsz.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
setlocal enabledelayedexpansion
– ha csak ezt raktad be, nem is fog működni.
:)
- A hozzászóláshoz be kell jelentkezni
Bocs, nagy örömmel visszaírtam, hogy a te megoldásod biztos jó. Oszt kiderült, hogy nem. Nem akartam elvenni a kedved. Lejebb még folytatom, ha érdekel.
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
ARJ? 2014-ben? Ez most halál komoly?
Én utoljára kb. a 90-es évek közepén használtam... :D
- A hozzászóláshoz be kell jelentkezni
Azóta nem fut le, pedig szükség lenne rája.
- A hozzászóláshoz be kell jelentkezni
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\mentespushd 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.
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Majd pingelj vissza lécci, hogy ezzel így megoldódott-e.
- A hozzászóláshoz be kell jelentkezni
Nem.
dir c:\dokk2014\81000081\ment :
m2140424.arj
Futtatva a ment.bat-ot, echo on-al, mindenhonnét egy m1116.arj-t akar másolni, és nem találja. Az egy teljesen más helyen van a gépemben.
- A hozzászóláshoz be kell jelentkezni