reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

synchronizace obsahu složky (na USB flash)

petrofff (30)|1.2.2010 11:37
Řeším přenos obsahu USBflash složky na HDD a zpět (pomalá flashka).
CMD dávka:
----------------------------------------
if exist %cil% RD /Q/S %cil%
echo a | XCOPY %zdroj% %cil% /R/E/K/Y
{Run: %cil% portable app}
RD /Q/S %zdroj%
echo a | XCOPY %cil% %zdroj% /R/E/K/Y
----------------------------------------
Vzhledem k pomalosti flashky a k faktu, že většina souborů/složek při 1použití zůstane nezměněna by použití utility, kt. by nahradila starší verze souborů novějšími (a smazala již neexistující soubory/složky) zkrátila čas přesunu z minut na sekundy (odhad).
Neřešil někdo něco podobného ?
(nic univerzálního; jednoúčelový program, ev script VBS - pro použití na compech s windows XP)
hl.hl (1387)|1.2.2010 12:02
Ja jsem na toto pouzil nekdy FreeFileSync, ale jen uzivatelsky spusteni synchronizace. Nicmene pisou, ze to jde pouzit i jako davkove spusteni.
petrofff (30)|1.2.2010 12:22
FreeFileSync vypadá výborně ...ale musím si zjistit, jestli k použití není nutná instalace na každý počítač, kde flashku použiju (to by nešlo). A jaká je celková velikost po rozbalení (kolega používá 123MB flasku a každý megabajt se počítá :-)
Aytech (475)|1.2.2010 12:26
Davka je dobra, u me ale stava ze strcim vic flesek do PC, takze pismeno disku se zmeni. Co treba

XCOPY "%1" "%2" /D /I %3
XCOPY "%2" "%1" /D /I %3

pak v prik. radku zadas SYNC, cil a zdroj
petrofff (30)|1.2.2010 12:40
Můj uvedený kód byl výňatek z BAT souboru,který je v rootu flashky. Vycházím z faktu, že po spuštění BAT souboru (ať je na kterékoli jednotce) obsahuje pseudoproměnná CD pracovní složku (tedy K:\ ; jindy E:\ atd)
Dávku chci uvést v autorunu a proměnné zdroj/cíl zjišťuji takto:
-------------------------------
set ZDROJ=%CD%Opera10usb
set CIL=%USERPROFILE%\Plocha
-------------------------------
Ale dík za typ, do hlubin XCOPY jsem ještě nestačil proniknout :-)
PS
Myslím že s tím názvem vlákna jsem to nedomyslel. Nejde o opravdovou vzájemnou synchronizaci dvou složek (tedy: Co není/je_starší v jedné složce ať se zkopíruje z druhé složky. A naopak)
OPAKUJI: je to "jednosměrná" synchronizace
Co je v CÍLi starší nebo chybí -> zaktualizovat ze ZDROJe
Co je v CÍLi ale není ve ZDROJi -> smazat
Aytech (475)|1.2.2010 15:07
Jina moznost napsat ne batch ale VBscript kde to muzes nastavit jak chces. ale s tim neporadim, nejsem programator :notsure :)

Jinak napis jak jsi s tim dopad
Dojigiri (1629)|1.2.2010 15:09
Jen co se týká dávek spouštěných z nějakýho umístění a potřeby zjistit odkud bylo spuštěno, lze to udělat i pomocí proměnné %0 (procento nula), která obsahuje celou cestu dávky, např. "F:\Startup\Davka.cmd". S vlnovkou ~ lze použít modifikátory d (disk), p (cesta), n (jméno), x (přípona), tedy např.

%~dp0 bude obsahovat: F:\Startup\
%~nx0 bude: Davka.cmd atd.

Jinak u xcopy bych asi použil: /D /Y /E /R /H případně ještě /Q a /Z.

Ovšem smazání přebytečných souborů cíle je trochu oříšek, lze sice použít příkaz "for /R %CIL% %%P in (*.*) do ..." pro vylistování souborů cíle, ovšem je problém jak zjistit relativní cesty (protože v %%P budou absolutní cesty souborů, ovšem pro ověření if exists ve zdroji by bylo potřeba cest relativních). Takže spíš asi rekurzivním voláním dávky by to asi šlo řešit ...
Dojigiri (1629)|1.2.2010 16:14
Teď jsem si to trochu zkoušel, viděl bych to asi zhruba takhle:

Soubor Sync.cmd:
[code]
@echo off

set SRC=%~dp0
set DST=X:\DestinationDirectory

call SyncFold.cmd "%SRC%" "%DST%"
xcopy "%SRC%" "%DST%" /D /R /H /K /E /Y /Q

pause
[/code]
(xcopy se volá až po pročištění adresářů - potenciálně rychlejší - po xcopy možná přibudou data a muselo by se procházet víc souborů)

Soubor SyncFold.cmd (promazání přebytečných souborů a složek):
[code]
@echo off

for /D %%P in ( "%~2\*" ) do call ProcFold %0 "%~1\%%~nxP" "%~2\%%~nxP"
for %%P in ( "%~2\*" ) do if not exist "%~1\%%~nxP" del /F "%~2\%%~nxP"
[/code]
(vlnovky a uvozovky jsou proto aby to fungovalo i pro dlouhý názvy - pokud se spojuje s něčím dalším, vlnovka odstraní uvozovky a celý se to dá do uvozovek)

Soubor ProcFold.cmd (je proto, aby nemusel být v SyncFold.cmd 2x příkaz for /D pod sebou):
[code]
@echo off

if not exist "%~2\." RD /Q /S %3
call %*
[/code]
(%* je místo %1 %2 %3 - vloží všechny parametry dávky - zavolá se dávka %1, tedy rekurzivně SyncFold, s parametry Source a Dest)
petrofff (30)|3.2.2010 18:14
Dík za inspiraci
Pro smazání "nadbytečných" dat mi vyšel tento kód (vše v 1 souboru, ještě jsem to nezkoušel):
SYNC.BAT
[code]
call :MAZAT %SRC% %DST%
call :PRIDAT %SRC% %DST%
goto :EOF
:: ---------------------------
:MAZAT
for %%A in ("%~2\*") do if not exist "%~1\%%~nxA" ( del /F/Q "%~2\%%~nxA" )
for /d %%A in ("%~2\*") do if not exist "%~1\%%~nxA" ( rd /S/Q "%~2\%%~nxA"
) else ( call :MAZAT "%~1\%%~nxA" "%~2\%%~nxA" )
goto :EOF
:: --------------------------
:PRIDAT
??????
[/code]
Teď už jen proceduru :PRIDAT, která aktualizuje starší soubory novějšími, přidává nově vzniklé složky/soubory.
Leda že by toto dovedl příkaz:
xcopy "%SRC%" "%DST%" /D /R /H /K /E /Y /Q
(ale mě vychází - podle HELPu - že bude kopírovat všechno, tj. zhruba 95-100% výsledného objemu dat)
PS
Zkusil jsem: xcopy /I /D /E /Y
a zdá se že vyhovuje všem požadavkům (přidám i /K /R /H /Q)
petrofff (30)|4.2.2010 11:57
Při testování (vypadalo to slibně) mi CMD interpret vyplivl chybové hlášení:
[code]C:\Dok\@TESTY\Cmd>xcopy "C:\Dok\Opery\Opera10usb" "C:\Documents an
d Settings\Petr\Plocha\VK_opera" /I/D/E/Y/K/R/H/Q
Nedostatek paměti
161 zkopírovaných souborů[/code]Tedy jen 20MB (z celkového objemu 90MB = 1300files/240folders)
Že bych narazil na nějaký limit ?
Paměť během kopírování => Volná fyzická: 363 z 1022MB

Zkusil jsem postup:
• Jiný cíl: OK
• Zopakovat: OK
• Smazat: ??? [code]
C:\Dok\@TESTY\Cmd>@xcopy "C:\Dok\Opery\Opera10usb" "C:\Dok\VK_opera
" /I/D/E/Y/K/R/H/Q
1316 zkopírovaných souborů

C:\Dok\@TESTY\Cmd>@xcopy "C:\Dok\Opery\Opera10usb" "C:\Dok\VK_opera
" /I/D/E/Y/K/R/H/Q
0 zkopírovaných souborů

C:\Dok\@TESTY\Cmd>rd /s "C:\Dok\VK_opera"
C:\Dok\VK_opera. Jste si jisti? (A/N) a
C:\Dok\VK_opera\profile\mail\store\account1\2008\09 - Proces nemá přístup k soub
oru, neboť jej právě využívá jiný proces.
C:\Dok\VK_opera\profile\mail\store\account1\2008\10 - Proces nemá přístup k soub
oru, neboť jej právě využívá jiný proces.
C:\Dok\VK_opera\profile\mail\store\account1\2009\07 - Proces nemá přístup k soub
oru, neboť jej právě využívá jiný proces.

C:\Dok\@TESTY\Cmd>Attrib /S /D "C:\Dok\VK_opera\*"
C:\Dok\VK_opera\profile\mail\store\account1\2008\09
C:\Dok\VK_opera\profile\mail\store\account1\2008\10
C:\Dok\VK_opera\profile\mail\store\account1\2009\07
C:\Dok\VK_opera\profile\mail\store\account1\2008
C:\Dok\VK_opera\profile\mail\store\account1\2009
C:\Dok\VK_opera\profile\mail\store\account1
C:\Dok\VK_opera\profile\mail\store
C:\Dok\VK_opera\profile\mail
C:\Dok\VK_opera\profile


» ???? Zůstaly pouze prázdné složky
[/code]
.....přestávám tomu rozumět
petrofff (30)|18.2.2010 13:45
Zjistil jsem, že při smazání celé lokace Opera10usb libovolným nástrojem (cmd.exe, TotalCommander, Odstranit v Průzkumníkovi ve WIN XP) se mazání neprovede u konkrétních podsložek u PATH=C:\Dok\VK_opera\profile\mail\store
Opakovaným mazáním nakonec zmizí i ty zbytky (při použití Průzkumníku)
Opera to tam má z nějakých důvodů takto ošetřené, možná aby se zabránilo vzniku nekonsistentního stavu při stahování pošty
Zajímalo by mě, jestli - pokud za to může nastavení nějakých typů atributů - by nešlo pomocí příkazů CMD tyto atributy "vynulovat" a pak provést smazání, aby nedošlo k chybám při běhu dávky ???
Případně jak zjistit, jestli za to nemůžou nějaká přístupová práva NTFS (což mě nic neříká, vím jen že systém je má nejvyšší)
PS
Zkusil jsem přejmenovat zálohu C:\Dok\VK_opera1010 a ono to odmítlo z důvodu že je vlastněno nějakým procesem
Přitom jde o normální podsložku z Documents, jejíž obsah jsem zkopíroval na RAMdisk, ale momentálně k ní nijak nepřistupuju. Atribut má [R] readonly ale je vyšedlý, takže s tím to snad nesouvisí.
Zkusil jsem příkaz: CACLS
cacls C:\Dok\VK_opera1010
C:\Dok\VK_opera1010 NT AUTHORITY\SYSTEM:F
NT AUTHORITY\SYSTEM: (OI)(CI)(IO)F
FIRST-VERSION\Petr: F
FIRST-VERSION\Petr: (OI)(CI)(IO)F
BUILTIN\Administrators: F
BUILTIN\Administrators: (OI)(CI)(IO)F
Ale nerozumím... (mám admin.práva => FIRST-VERSION\Petr)
PLS poraďte
Dojigiri (1629)|18.2.2010 14:21
No tak věci ze zabezpečení by byly ve vlastnostech složky (pokud není zapnutý zjednodušený sdílení anebo to není Home verze Windows) anebo příkazem cacls (http://ss64.com/nt/cacls.html) kterej by případně šel i použít v dávce před samotným mazáním k vyresetování zabezpečení. Stejně tak atributy lze změnit příkazem attrib.

Ale IMHO to nebude ten problém, protože jinak by to si myslím nešlo vymazat ani tím několikátým pokusem (protože práva a atributy by se neměnily). Spíš to něco musí "držet", buď jestli je spuštěná samotná Opera (která by samozřejmě neměla běžet, pokud se provádí nějaká operace s jejím profilem) nebo nějakej její "hlídač" nebo něco podobnýho.
petrofff (30)|18.2.2010 14:30
Mám XP Home
Jdu studovat ty cacls dík
Tak ne ...myslím že jsi to trefil
Pokud si vzpomínám, kdosi dělal při úpravách kopírování složky s poštou a to zásadně při běžící aplikaci ...to znamená že ona Opera při ukončení s těma mail podsložkama cosi provede ale co ???
petrofff (30)|19.2.2010 07:36
Tak jsem (za pomoci programu unlocker) zjistil, že přístup blokoval proces Explorer.exe a mě vůbec nenapadlo, že při přejmenování složky nesmím mít otevřeno žádné okno Průzkumníku s jakoukoli podsložkou.
Další oprava: tak teď jsem průzkumníkem zkopíroval složku Opery z RAMdisku na HDD (=NTFS) a taky na flashku (=FAT32) . A pak obě kopie v Průzkumníku bez potíží smazal na 1 zátah
Takže HYPOTÉZA o speciální ochraně se nekoná - ledažeby k ní došlo jen občas =např. při ukončení Opery v nevhodném okamžiku, když zrovna zpracovává MAIL databázi nebo něco takového.
Kombinování nástrojů/způsobů:
Nevíte jestli TotalCommander, XCOPY a Průzkumník při kopírování zacházejí s přístup.právy shodně ?