Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: nettezzaumana 30 Července 2008, 19:32:14
-
ahoj,
nemohl by mi nekdo prosim napsat elementarni .bat, kterej provede nasledujici kroky (ps. batovky psat neumim)::
dopredu je dano ::
$FILENAME_PREFIX // prefix jmena, jez maji vsechny soubory stejny .. vsechny soubory co potom program pouzije je $FILENAME_PREFIX.*
$POCET_SOUBORU // z toho se muze vygenerovat $FILENAME_TAILs.. tails se davaji podle klice >> aa,ab,ac .. zz, spis bych ale neinicializoval zbytecne a udelal to nejaka aka ::
for((x=0,x<$POCET_SOUBORU;x++)) { ..; }
1) overi, jestli se v soucasnem adresari nachazi predem definovane soubory $FILENAME_PREFIX.{aa,ab .. zz} na zaklade $POCET_SOUBORU, pokud ne, ukonci se
2) spocte soucet velikosti danych souboru a overi, jestli se na svazku nachazi jeste jednou tolik mista.. pokud ne, ukonci se
ad.x) pokud by nekdo chtel a byl tak laskav, tak do te .batovky lze zakomponovat nejakou trivilni interaktivitu a nebo podporu spousteciho parametru .. pokud ano, tak v priklade spoustecich parametru by bylo 100% dostatecne ::
if ( ! $nejaky_spousteci_parametr) { overuju_pritomnost_souboruu_v_aktualnim_adresari(); }
if ( $nejaky_spousteci_parametr) { overim,_jestli_se_jedna_o_cest?y_ke_*vsem*_pozadovanym_souborum(); }
jina interaktivita neni nutna .. $FILENAME_PREFIX a $POCET_SOUBORU se bude upravovat primo editaci .batovky
ad.2) jmena promennych pouzijte dle libosti, tyto jsem pouzil jako priklad
diky a zdravim
-
.. to fakt nikdo nevi? :/
a to jsem pouzil naprosto prehledny a vystizny zapis jak to ma vypadat, takze netreba nic vymyslet, akorat napsat cca10 radek v editoru ..
-
Možná to nikdo neví, protože dokumentace k "batch language" je naprosto žalostná - já jsem dělal s "batama" docela dlouho, a tyto funkce jsem ještě nikdy neviděl :D - a to jen proto, že jsem se o nich nikde nedozvěděl ::)
-
batovky podporují podmínky atd. ale ta dokumentace..
pokud pomůže.. tady jsem něco vygooglil :) http://commandwindows.com/
-
ntz a potřebuješ čistě bat, nebo to bude pro windows a můžu tím pádem použít wsh?
1) overi, jestli se v soucasnem adresari nachazi predem definovane soubory $FILENAME_PREFIX.{aa,ab .. zz} na zaklade $POCET_SOUBORU, pokud ne, ukonci se
pouze souvisla rada?
2) spocte soucet velikosti danych souboru a overi, jestli se na svazku nachazi jeste jednou tolik mista.. pokud ne, ukonci se
a pokud ani jedna z negativnich podminek neni splnena tak ma delat co?
-
No nic, na zaklade dostupnych info si zkus prebrat toto:
(spousteni WScript.exe TentoSouborSKoncovkou.vbs) - windows to snad maji asociovane defaultne
'-------------------------------
' pro použití WScript.exe - pro použití s CScript.exe si změn zápisy msgbox na echo - viz komenty
'-------------------------------
Option Explicit 'promenne ktere neuvedu Dim nemohu pouzivat - hlida preklepy v nazvech promennych
Dim fso, wsa 'dam vedet interpretu jake nazvy promennych mam v umyslu pouzivat, vsechny jsou netypove - je to vbs
Dim flPrefix, fl
Dim pocet, i
Dim volneMisto, zabrano
Dim d, aktCesta
Dim msg
flPrefix= "ntzsoubor" 'prvni cast nazvu souboru, tecku a koncovku budu dopocitavat
pocet= 222
msg = ""
zabrano = 0 'budu pocitat kolik mista zabiraji soubory ntzsoubor.aa ....
'trocha interaktivity:
pocet = eval(InputBox("zadej počet", "obvykle zadáváš", "222")) 'dalsi zpusob jak ziskat hodnotu kolik ze to souboru mam pocitat - tentokrat dialog boxem
Set wsa = WScript.arguments 'nastineni dalsiho zpusobu jak ziskat pocet - jako parametr z prikazove radky, ve wsa mam ted vsechny parametry zadane pri spusteni souboru
msgbox "pocet parametru: " & wsa.count 'pokud to ma byt i pro commandline pouzij namisto msgboxu WScript.echo() - count = pocet predanych parametru oddelenych mezerou
if wsa.count > 0 then WScript.echo " prvni je" & wsa.Item(0) end if 'k parametrum muzu pristupovat pres item(0) pro prvni, Item(1) pro druhy atd
'nebo for each arg in wsa 'nebo je chci zpracovat (v tomto pripade jen vypsat) vsechny
'WScript.Echo arg
'next
Set fso = CreateObject("Scripting.FileSystemObject") 'bez tohoto nemuzu pristupovat k souborum
volneMisto = fso.GetFile(WScript.ScriptFullName).Drive.AvailableSpace 'zjistim misto jake mam na disku ze ktereho jsem spustil skript (bere do uvahy i pripadne nastavene diskove quoty)
'ted spocitam nazev pripony - samozrejme jsem to mohl zadat namisto "i" v pripona(i) o kousek dale - ale kdybych chtel pouzit vypocet pripony na vice mistech programu a pripadne jej nekdy zmenit... - dam to do funkce
Function pripona(cislo) 'mala abeceda - (0-675) ,musi platit ze cislice nula="a", pouze dvojznaky
pripona=(chr(int(cislo/26)+97)) & (chr(((cislo/26)-(int(cislo/26)))*26+97))
End Function
'projdu "pocet" souboru - pocet je zadavan lidsky, 0=nula prubehu, 1=1 prubeh (cyklus for 0 to 0 probehne prave jednou)
for i=0 to pocet-1
fl = flPrefix & "." & pripona(i) 'fl obsahuje ted nazev souboru vc. pripony
if fso.FileExists(fl) then 'pokud soubor existuje
zabrano = zabrano + fso.GetFile(fl).size 'vezmi jeho velikost a pricti ji - zabrano obsahuje sumu velikosti jiz otestovanych souboru
else
msg=msg & "E: " & fl & " " 'soubor neexistuje, zaznamenej do msg, kterou na konci vypi3u
end if
next
msgbox "volneMisto: " & volneMisto & " zabrano: " & zabrano & " " & aktCesta & " " & msg 'jen ukecany vystup
if len(msg) > 0 then WScript.Quit(22) 'do msg jsem v prubehu programu zapisoval chybejici soubory, pokud tedy tato promenna neni prazdna tak nejake chyby byly tak skoncim s errorlevel 22
'tohle jsou jen ukazky co delat dal pokud chyby nebyly
' chyby nemame, zacneme treba kopirovat, presouvat nebo vytvaret foldery, pripadne si zavolame zip
'fso.CreateFolder jaky
'fso.CopyFolder odkud, kam, prepisovat?
'fso.CopyFile dtto
'fso.MoveFile dtto
'ted ten zip
'Set shell = WScript.CreateObject("WScript.shell") 'budu volat externi program - musim mit pres co
'dim prg, soub
'prg = "zip.exe"
'soub = """cvf C:\nekam""" 'chci mu predavat jako soucast retezce i uvozovky tak je zdvojim
'shell.Run prg & " " & soub
//edit: doplneno vice komentaru
-
..
wow :), bozi. Diky moc
-
neni zac, na win moc jinych (rozumnych) sanci na skriptovani neni - pres windows script host se dostanu i k vymazu klicu registru coz s .reg soubory nebo batem ...
-
#!/usr/bin/perl -w
# "use strict;" is highly recommended !! .. pouzivat
use strict;
my ($POCET, $PREFIX, $z, $FILE);
# priradime si promenne
$POCET = '10';
$PREFIX = "kiki.xx";
# udelame cyklus o tolika prubezich, kolik mame souboru ke zkontrolovani. V kazdem prubehu se zeptame
# na aktualni soubor, jehoz nazev se dynamicky generuje, takze zadna zbytecna inicializace a plneni
# promennych ..
# soubor se nam generuje spojenim prefixu a odvozenim koncovky z cisla prubehu, v jakem se nachazime.
# prvni znak ma hodnotu: int($z / 26) // int() nam dela integry, tedy cela cisla
# druhy znak ma hodnotu: int($z % 26) // '%' znak pro deleni modulo
# v perlu je funkce chr(n), kde n je cislo a fce vraci odpovidajici znak dle poradi v ascii tabulce, takze napr:
# chr(97) == 'a' // true
# die() vraci bez parametru exit 1 + pripadne hlasky
# a z toho je patrne, ze syntaxe perlu dovoluje zapis: { .. } if(..);
for($z=0;$z<$POCET;$z++) {
$FILE = $PREFIX.'.'.chr(int($z / 26) + 97).chr(int($z % 26) + 97);
die "missing : $FILE\n" if (! -e $FILE);
die "have no read permissions : $FILE\n" if (! -r $FILE);
};
print "all done!\n";
exit 0;
nesel by ten Tvuj skript nejak zjednodusit, abych mu rozumnel ? koukal jsem se na nej, potreboval jsem ho upravit, ale je to na me desne slozity.
ad.1) interaktivitu jsem ze sve odpovedi naschval vypustil, aby to bylo co nejsrozumitelnejsi .. Interaktivita, parsovani vstupu, testy na zadane parametry apod v nasem pripade nijak nesouvisi s behem programu .. beztak jdou velice sikovne a prehledne nastrkat do uz existujici struktury hlavni smycky.
ad.2) dokonce by me specialne zajimalo, jak a v cem lze ve win napsat takovouhle trivialni ulohu.
kdyz to napisu jeste jednou zcela oklestene, tak je po rozebrani vyse videt jak je to ve skutecnosti jednoduche ::
$POCET = '10';
$PREFIX = "kiki.xx";
for($z=0;$z<$POCET;$z++) {
$FILE = $PREFIX.'.'.chr(int($z / 26) + 97).chr(int($z % 26) + 97);
exit 1 if (! -e $FILE);
};
exit 0;
.. neslo by to teda prosim nejak zjednodusit .. chci tomu porozumet?
zdravi ntz;)
-
Perl je i pro windows...
vbs oproti perlu
- namísto use strict je option explicit
- řádky končí enterem, ne středníkem
- for končí next
- if končí end if
- proměnné se neuvozují $
- namísto exit je wscript.quit
- komentáře se uvozují '
- & scita retezce
- namísto % pro modulo jej dopočítám inverzně (int funguje stejně).
- neelementární funkce se píší i s názvem objektu který je obsahuje - s dot notací - neelementární je skoro všechno :)
Dobře tak zjednoduším na kostru, vynechám kosmetiku, udělám identický kód k perlu (až na jedno echo navíc):
'soubor ntz2.vbs
Set fso = CreateObject("Scripting.FileSystemObject") 'tohle musím, jinak nemám přístup k souborům atd.
flPrefix= "kiki"
pocet= 10
for i=0 to pocet-1
fl = flPrefix & "." & (chr(int(i/26)+97)) & (chr(((i/26)-(int(i/26)))*26+97)) 'nezere to modulo takze je to trochu delsi
if not fso.FileExists(fl) then
WScript.Quit(1) 'testovany soubor neexistuje - ukonci skript - jakakoliv navratova hodnota - v tomto pripade 1
end if
next
WScript.Echo "vsechno OK" 'lidsky vypis, tento radek neni potreba, nastavuje se errorlevel v quit()
WScript.Quit(0) 'ani tento neni potreba - kdy jej vynecham je to stejne jako kdyz jej napisu
celé i s testováním na specifickou návratovou hodnotu (dos errorlevel)
nějaký .bat s obsahem
@rem errorlevely maji takove zvlastni pocty - http://www.chicagotech.net/nestederrorlevel.htm
@ntz2.vbs a treba nejake parametry
@if ERRORLEVEL 1 echo chyba
//edit: pridal jsem i vice komentaru k tomu puvodnimu prispevku vyse
//edit2: Kdyz tak na to koukam ze ono to ma slouzit po prenosu rozrezaneho ehm, "vecernicek.avi" na nejakou masinu s windows a opetovnemu slepeni pokud bude dost mista na disku. ;D
Takze nejsme OT, protoze vlastne resime export vecernicku z linuxu ven :)
Pokud se opravdu jedná o tento případ (spojování binárních souborů) tak pokud bude test ok tak bude stačit upravit puvodni kod asi takto:
............ zacatek zustava a pak
dim sestav, scitam
sestav=""
scitam=""
'projdu "pocet" souboru - pocet je zadavan lidsky, 0=nula prubehu, 1=1 prubeh (cyklus for 0 to 0 probehne prave jednou)
for i=0 to pocet-1
fl = flPrefix & "." & pripona(i) 'fl obsahuje ted nazev souboru vc. pripony
if fso.FileExists(fl) then 'pokud soubor existuje
zabrano = zabrano + fso.GetFile(fl).size 'vezmi jeho velikost a pricti ji - zabrano obsahuje sumu velikosti jiz otestovanych souboru
sestav = sestav & scitam & fl
scitam="+" 'pro sestaveni stringu pro multikopii
else
msg=msg & "E: " & fl & " " 'soubor neexistuje, zaznamenej do msg, kterou na konci vypi3u
end if
next
'.................. tady je ten nejaky ukecany vypis a test a pokracujeme textem 'za tohle jsou jen ukazky co delat dal pokud chyby nebyly.............
if volneMisto < zabrano then WScript.Quit(2) ' nemame dost mista - skoncime
sestav="cmd /c copy /b " & sestav & " " & flPrefix & ".avi"
'ted by melo byt obsahem stringu sestav toto: cmd /c copy /b kiki.aa+kiki.bb+...kiki.da kiki.avi
WShell.Run sestav 'a ted to predhodim shellu aby mi secetl predane binarni soubory a vytvoril z nich jedno avi
'upravy jsem ted psal z hlavy takze pokud bude preklep tak se omlouvam.
-
diky. ted je to0 presne ono a uz tomu dokonce i rozumim :D
dikec by ntz ;)