CMD dávka s "if" ("not")
Nazdar,
snažím se vytvořit dávku do batového souboru, která by mi překopírovala data z externích disků (flashek a pokud možno i externích HDD) na moji flashku. To by samo o sobě bylo triviální, ale já potřebuji nějakým způsobem rozlišit co má kopírovat a co ne. Mám hned dva problémy:
1.) Vím jak rozlišit kopírování podle typů souborů, ale rád bych to rozlišil i podle velikosti. Pravděpodobně na to bude něco s podmínkami "if" (př."not"), ale v těch se orientuji je na základní úrovni. Potřebuji tedy následující příkaz:
@xcopy "g:*.pptx" "COPY_G\*.*"
rozlišit tak, aby se nekopíroval soubor větší jak např. 5MB. Ale nevím, jak to udělat. Resp. ve svých pokusech jsem neuspěl.
2.) Pak mám druhý problém. Když vytvořím dávku:
@echo off
@xcopy "g:*.txt" "COPY_G\*.*"
@xcopy "h:*.doc" "COPY_H\*.*"
@xcopy "e:*.docx" "COPY_E\*.*"
pause
tak budu samozřejmě kopírovat data z umístění g (txtčka),h (MS Office W03),e (MS Office W7+), ale já chci kopírovat data pouze z flashek. Nechci čekat, než dávka "projede" i jednotky počítače, na kterém ji použiji. Zkoušel jsem to omezit přes "diskpart" ,ale samozřejmě bezvýsledně. Navíc "diskpart" vyžaduje administrátorská práva a já bych svoji dávku používal i na jiném pc, než mém. Takže mne napadlo opět vnořit funkce "if" a omezit to tentokrát podle velikosti jednotky. Aby příkaz jednoduše přeskočil jednotku větší, než 16(32)GB. Bude to sice omezeno vzhledem k externím HDD, ale na to si pak napíšu dávku samostatně.
Bohužel opět narážím na chabou znalost podmínek v cmd.
Takže si od Vás vzdělanějších slibuji nejen to, že mi pomůžete s vytvořením této dávky, ale i mi vnesete trochu světla do podmínek "if".
Děkuji
rozlišení disků: kopíruj to od písmena e: - s tím že si otestuj, jestli neexistuje skrytý adresář \recycle* (pozor, mívají různé názvy):
nad rozlišením velikosti se mi nechce bádat, dej si help: "for /?"
budeš to kopírovat a vyhodnocovat v cyklu, a taky tě zaujme parametr: "%~zI ... Rozvine %I na velikost souboru."
velikosti umí porovnávat: "if /?"
syntaxe pro příkazový řádek je zoufale neschopná, ani se nedivím že za dobu windows ho ms už počtvrté zkouší nahradit.
Je nějaký důvod proč to psát zrovna v BAT? Pokud máš XP a novější, tak by se ti to lépe dělalo v PowerShellu (Vista a Win 7 už to mají nainstalované v základu).
Nepochopil jsem jak to "lední brtník" myslíš. Tak jsem vytvořil toto:
To porovná velikost flashek a vyhodí, jestli je moje flashka (%flashmy%) větší, nebo menší než ta z které chci kopírovat. Místo echa pak dám pokyn ke kopírování. No ale má to háček. Nevím, jak dosadit místo "F:" údaj ve velikosti v GB. To je první část, co potřebuji pomoc vyřešit.
Nad omezením souborů podle velikosti jsem také bádal, ale neúspěšně. Potřeboval nějakou větší pomoc.
já zase nepochopil, proč reaguješ na uživatele "ws" a píšeš Brtníkovi...
Omlouvám se, špatně zařazeno...
Napadlo mne to rozlišit podle souboru, které mají pouze pevné disky ve smyslu "if exist". Je nějaký takový soubor? Nebo naopak na flashkách?
Minimálně tak rozliším systémovou partition, protože tam bude složka "windows".
Tak problém s velikostí flashky vyřešen. prostě jsem použil if (jak jsem uvedl v tom špatně zařazeném příspěvku a funkci %cd%. Když bude soubor uložen v rootu flashky, tak vždycky porovná s ní.
NE!!!!! Jsem zase na začátku. Ono to neporovnává cestu podle velikosti! Ale podle pořadí písmen v abecedě.!!! Fakt už nevím. Nějaké nápady?
Nejak som Ti neporozumel... Ehm, to akože chceš vytvoriť nejaký automat, ktorý sám pozná odkiaľ a kam má kopírovať? Myslíš, že si to samo zistí, že sa jedná o vymeniteľné médium a práve z tohto to má kopírovať? A akože to samo zistí, že zo všetkých diskov, ktoré sú k dispozícii bez Tvojho zásahu to tam na správne miesto nakopíruje?
Možno som unavený, ale fakt nechápem.
Predsa dávku spustíš s parametrami odkiaľ - kam, hotovo - všetko ostatné už v dávke máš ošetrené nie?
Zkusím to říct znovu srozumitelněji, protože moje předchozí text jsou docela zmatené.
Chci mít vytvořenou dávku v batovém souboru, který budu mít uložený na flashce a bude fungovat následovně..:
Jakmile zasunu flashku do jakéhokoliv pc (od win XP po win 7) a spustím následujícím ji, tak vykoná toto:
Na moje flashku, zkopíruje všechna data ze všech ostatních flashek, které jsou v tom pc zasunuté na tu moji.
A udělá to s následujícími podmínkami: půjde jen o soubory určitých typů a do určité velikosti.
Ale narážím na mnoho úskalí. Musím zabránit tomu, aby kopírovala z umístění větších, než (16)32GB (standart ní největší flashka) -> tím by se zabránilo tomu, aby procházela disky v počítači. (Znám dost lidí, co mají 2-3 disky a okolo 7 partition od C: po I:, každou po 250GB; o síťových jednotkách ani nemluvě).
A pak musím omezit kopírování podle velikosti. Aby dávka NEkopírovala soubory - jeden např. o velikosti 2GB (prostě zbytečně velké).
Spousty věcí už jsem vyřešil sám. Už kopíruje soubory i s adresáři a přitom se drží vybraných typů. Už nekopíruje "ze sama sebe" (pomocí if+%cd%). Atd. atd.
Ale jinými slovy, jsem pořád tam kde jsem byl, když jsem tenhle dotaz položil, přestože jsem myslel, že je už vyřešeno.
Veľmi Ti neporadím, nie som "guru" (ale možno s pomocou niekoho iného).
Skús použiť príkaz: wmic logicaldisk get caption,description,filesystem mne to na Win7 funguje...
Výstup si preveď do nejakých premenných, alebo čo ja viem (fakt sa nevyznám...) a ak sa jedná o "removable disk" je jasné o čo ide...
To je geniální. Děkuju. O příkazu "wmic logicaldisk ..." jsem vůbec nevěděl. Je i v XPčkách? (Já mám win7).
Jinak nejlepší je asi použít kombinaci toho tvého "wmic logicaldisk get caption,description,filesystem" a ještě ",size".
Každopádně je tu někdo, kdo mi ukáže, jak převést výsledky do proměnných? Já umím v CMD používat proměnné pouze u věcí, co mám zadané (jako %date%, %username% atd.) - tedy spíš na základní úrovni. Ale jak vykuchám proměnné třeba z tohohle: (exportovaný příkaz "wmic logicaldisk get caption, description, filesystem, size >reseni.txt")
Díky. Omlouvám se, že jsem se teď chvíli nehlásil, takže to zapadlo, ale byl jsem na dovolené.
Mohl by tě zajímat příkaz (externí) robocopy, http://www.google.cz/search?client=opera&rls=cs&q= robocopy&sourceid=opera&ie=utf-8&oe=utf-8&channel= suggest
Pavel
Jo, jo, ten znám. Jenomže je standardně myslím až od Visty. Já bych rád používal tohle na všechny win od winXP. Proto taky ověřuji, jestli funguje na winXP korektně i "wmic logicaldisk ...".
Každopádně teď se snažím vymyslet ty proměnné. Až z toho vznikne něco aspoň trochu funkčního, tak napíšu. Ale samozřejmě vítám pomoc.
Snad není problém umístit robocopy na tvou flashku, ne? Robocopy umí (kromě jinýho) i kopírovat soubory větší/menší než zadaná hodnota. To by se ti dost hodilo, ne?
Pavel
Jo, ale jak umístit příkaz robocopy na moji flashku? Měl jsem dojem, že bude chtít instalaci - tzn admin práva. Nebo je nějaký způsob, jak umístit externí příkaz na flashdisk a z něj ho spustit?
Teď nevím zda je robocopy nutný instalovat nebo ne. Vyzkoušej a uvidíš. Tj. nakopíruj robocopy.exe na tvou flashku a zkus ji spustit na PC s WinXP.
Pavel
Zkusím to přes WMVare. Ale jinak stejně potřebuji pomoc s převedením výsledku toho příkazu
na proměnné. Nevíš náhodou jak na to?
Dobře, tak jsem to na čas hodil k ledu a budu na tom průběžně dělat. Potřebuji ale poradit, jestli jde výpis úspěšnosti dávky po skončení zapsat do dokumentu. Mě to přes prosté ">" nešlo a už na tom dělám hodinu. Kde mám chybu? Můžete sem někdo hodit nějaký vzorový příklad?
Př.:
Řekněme, že mám dávku, která třeba vytvoří složku ("mdir") - úspěšně. Něco někam překopíruje ("xcopy"), ale to jí nepůjde, protože soubor nenajde. a pak třeba něco smaže ("del/erase"), což se jí povede. Jak udělat výpis, který by řekl: mdir OK, xcopy ERROR, del OK. Nemusí to být samozřejmě takto (i s přepisem příkazu), stačí mi zatím jen výpis ("OK, ERROR, OK")
Doufám, že jsem to s tou názorností nepřehnal.
Díky
errorlevel.php