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

Název: .bat ve windows [vyřešeno]
Přispěvatel: 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
Název: Re: .bat ve windows
Přispěvatel: nettezzaumana 31 Července 2008, 15:27:58
.. 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 ..
Název: Re: .bat ve windows
Přispěvatel: Firzen 31 Července 2008, 17:22:51
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 ::)
Název: Re: .bat ve windows
Přispěvatel: qUAKER 31 Července 2008, 18:22:15
batovky podporují podmínky atd. ale ta dokumentace..

pokud pomůže.. tady jsem něco vygooglil :) http://commandwindows.com/
Název: Re: .bat ve windows
Přispěvatel: Martin Kiklhorn 31 Července 2008, 18:24:00
ntz a potřebuješ čistě bat, nebo to bude pro windows a můžu tím pádem použít wsh?

Citace
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?

Citace
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?
Název: Re: .bat ve windows
Přispěvatel: Martin Kiklhorn 31 Července 2008, 22:57:25
No nic, na zaklade dostupnych info si zkus prebrat toto:
(spousteni WScript.exe TentoSouborSKoncovkou.vbs) - windows to snad maji asociovane defaultne
Kód: [Vybrat]
'-------------------------------
' 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
Název: Re: .bat ve windows
Přispěvatel: nettezzaumana 31 Července 2008, 22:58:53
..
wow  :), bozi. Diky moc
Název: Re: .bat ve windows
Přispěvatel: Martin Kiklhorn 31 Července 2008, 23:12:38
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 ...
Název: Re: .bat ve windows
Přispěvatel: nettezzaumana 01 Srpna 2008, 01:37:21
Citace
#!/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 ::
Citace
$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;)
Název: Re: .bat ve windows
Přispěvatel: Martin Kiklhorn 01 Srpna 2008, 02:29:02
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):

Kód: [Vybrat]
'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
Kód: [Vybrat]
@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
Kód: [Vybrat]
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.
Název: Re: .bat ve windows
Přispěvatel: nettezzaumana 01 Srpna 2008, 12:02:43
diky. ted je to0 presne ono  a uz tomu dokonce i rozumim :D

dikec by ntz ;)