Ovládáme (nejen) windows pomocí visual basic script 2. díl

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23605
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline
Kontakt:

Ovládáme (nejen) windows pomocí visual basic script 2. díl

Příspěvekod ITCrowd » 08 čer 2021 10:32

Proměnné
Definice proměnných je ve vbs jednoduchá. Proměnná je vše, co jazyk nevyhodnotí jako příkaz. Z vyšších programovacích jazyků známe i typy proměnných (např. integer, string atd.), ve vbs je jediný typ - variant. I tak zde existují určitá pravidla:
1. proměnná musí vždy začínat písmenem
2. jméno proměnné může mít max. 255 znaků
3. jméno proměnné se nesmí shodovat s příkazem jazyka vbs
4. jméno proměnné se nesmí shodovat s vnitřní konstantou definovanou jazykem (např. vbOkOnly příklad v předchozím článku)
5. nesmí obsahovat speciální znaky (mezera, !, + atd.)
V předchozím článku jsme použili proměnnou tlacitko. Tento příklad ukazuje, že není třeba proměnnou definovat. I to však lze, a v případě složitějších kódů to doporučuji. Hodně to pomůže při hledání chyb.
Příklad:

Kód: Vybrat vše

Cena = 123.45
DPH = Cena * 0.22
WScript.Echo "Cena = " & Cens & vbCrLf & "DPH = " & DPH

Výsledek:
PromennaErr.png
Chyba
PromennaErr.png (1.75 KiB) Zobrazeno 1345 x

Co se stalo? Udělali jsme překlep v názvu proměnné Cena. Pokud bychom si dali práci a proměnné definovali, pak bude kód vypadat takto:

Kód: Vybrat vše

Option Explicit 'Tento příkaz říká skriptu, že proměnné budou deklarovány
Dim Cena
Dim DPH
Cena = 123.45
DPH = Cena * 0.22
WScript.Echo "Cena = " & Cens & vbCrLf & "DPH = " & DPH

V tomto případě skript nahlásí chybu:
PromDef.png
Chyba v definici
PromDef.png (7.42 KiB) Zobrazeno 1345 x

Všimněte si:
- ve vbs se nepoužívá desetiná čárka, ale tečka. Na tohle pozor.
- příkaz Option Explicit nastavuje nutnost definice proměnných.
- ampersand & spojuje řetězce (lze použít i znaménko +, ale tohle nebude fungovat, pokud spojujeme řetězec a číselnou proměnnou)
Kromě příkazu Dim lze použít i příkaz Const. Ten je pro proměnné, které se nemění (konstanty).
Příklad:

Kód: Vybrat vše

'Příklad deklarace proměnných
Option Explicit 'Tento příkaz říká skriptu, že proměnné budou definovány
Dim text, titulek
text = "Zpráva textu"
titulek = "Titulek"
Const pi = 3.14159 'Definice číselné konstanty
Const cesta = "C:\Program Files\MS Office\winword.exe" 'Definice cesty k souboru

Všimněte si:
- zatímco u číselné proměnné se zadává pouze číslo, u řetězcové proměnné je třeba text dát do uvozovek.
Datum a čas:
Příklad:

Kód: Vybrat vše

Dnes = (Date()) 'zjisti aktuální datum
Ted = Time() 'zjisti aktuální cas
Den = WeekdayName(Weekday(Now())) 'jméno dne
WScript.Echo "Dnes je " & Den & ", " & Dnes & vbCrLf & Ted
DateTime.png
DateTime
DateTime.png (2.01 KiB) Zobrazeno 1345 x

Všimněte si:
- skript vrací název dne v českém jazyce. Toto je vlastnost skriptu, který přebírá národní prostředí windows. V anglické verzi bude název v angličtině. Totéž platí i pro název měsíce. Více o datových funkcích třeba zde: https://www.w3schools.com/asp/asp_ref_v ... ctions.asp
Operace s proměnnými:
- matematické (sčítání, odčítání, dělení, násobení atd.)
- logické (NOT, AND, OR, XOR atd.)
- porovnání (<, >, <=, >=, =, <>) menší než, větší než, menší a rovno než, větší a rovno než, rovno, nerovno.

Kolekce a objekty:
Opět se jedná o proměnné, nicméně se nastavují klíčovým slove Set
Kolekce - je soubor objektů. Klidně může obsahovat jen jeden objekt.
Objekt - systémová součást, která má vlastnosti objektu (soubor, adresář, služba, tiskárna atd.)
V tomto tématu můžete najít skript upravený do VBA (pro excel): viewtopic.php?f=35&t=220692

Kód: Vybrat vše

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colPrinters = objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Default = TRUE")

For Each objPrinter In colPrinters
    strOldDefault = objPrinter.Name
    strOldDefault = Replace(strOldDefault, "\", "\\")
Next

Set colPrinters = objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Name = 'PDFCreator'")
   
For Each objPrinter In colPrinters
    objPrinter.SetDefaultPrinter
Next

Application.Wait (Now + TimeValue("0:00:02"))

' Sem doplň příkaz k tisku

Set colPrinters = objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Name = '" & strOldDefault & "'")

For Each objPrinter In colPrinters
    objPrinter.SetDefaultPrinter
Next

Set objWMIService = Nothing
Set colPrinters = Nothing

Co to dělá?
- vytvoří kolekci všech tisdkáren, které jsou výchozí (to může být pouze jedna).
- uloží její název strOldDefault = objPrinter.Name do proměnné strOldDefault. (replace je zapotřebí pro konverzi jména v případě že by výchozí tiskárna byla síťová).
- vyhledá podle jména požadovanou tiskárnu. Tedy opět kolekci tiskáren, tentokrát se změněným dotazem na jméno tiskárny.
- objekt této tiskárny nastaví jako výchozí
- Počká 2 sec (pro jistotu, aby měl systém čas udělat změny).
- Místo pro příkaz k tisku z excelu - zde nedoplněno
- Vyhledá tiskárnu dle uloženého jména v proměnné strOldDefault (opět kolekce tiskáren, opět hledá vlastnost "Name" objektu)
- Nastaví ji jako výchozí (tak vrátí změnu zpět).
Pro jistotu dodávám i kód ve vbs - není stejný, ale je hodně podobný:

Kód: Vybrat vše

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Default = TRUE")

For Each objPrinter in colPrinters
    strOldDefault = objPrinter.Name
    strOldDefault = Replace(strOldDefault, "\", "\\")
Next
WScript.Echo strOldDefault

Set colPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Name = 'PDFCreator'")
   
For Each objPrinter in colPrinters
   WScript.Echo objPrinter.Name
    objPrinter.SetDefaultPrinter()
Next

Wscript.Sleep 2000

Set colPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Name = '" & strOldDefault & "'")

For Each objPrinter in colPrinters
    objPrinter.SetDefaultPrinter()
Next

Set objWMIService = Nothing
Set colPrinters = Nothing

Vypadá to složitě, ale má to logiku. Např. u služeb - vytvořím kolekci služeb, vyberu objekt(y) služeb, které mě zajímají, a pak se můžu dotazovat na vlastnosti (název, stav atd.)
Všimněte si:
- Set objWMIService = Nothing znamená, že uvolníme objekt pro celý systém. Pokud bychom toto neudělali, objekt by existoval v systému až do restartu.
- příkaz "Select * from Win32_Printer Where Default = TRUE" je vlastně SQL dotaz, který zařadí do kolekce tiskáren pouze ty, které jsou dotazem definovány. V tomto případě vybere pouze jednu, a to výchozí tiskárnu.
Příklad:

Kód: Vybrat vše

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.WorkBooks.Open _
    ("C:\VzorKon.xlsx", 1, False) 'Plná cesta k souboru
' 1=jen pro čtení, False=soubor se nebude vytvářet pokud neexistuje

' Načtení adres z excel souboru
intRow = 2 '2=řádek od kterého budeme začínat
text = ""
With objExcel
     .Sheets("List1").Select
  Do Until .activeSheet.Cells(intRow,1).Value = ""
    text = text & "(" & objExcel.Cells(intRow, 5).Value & ")," & vbCrLf '5=číslo sloupce s e-mailovými adresami
    intRow = intRow + 1
  Loop
End With
objWorkbook.Close
objExcel.Quit

Tento kód přistupuje k excelovskému souboru se senamem adres. Pokud bychom objekt neuvolnili, bude se po každém spuštění skriptu vytvářet nový objekt objExcel. Vůbec to na pohled nepoznáte, ale pokud byste se podívali do procesů, najdete zde přesně tolik excelů, kolikrát byl spuštěn skript. To je samozřejmě nežádoucí.

Input - občas potřebujeme přímou interakci k zadání proměnné. K tomu slouží příkaz Input:

Kód: Vybrat vše

cislo1 = Inputbox("Zadej první číslo", "Příklad")
cislo2 = Inputbox("Zadej druhé číslo", "Příklad")
cislo1 = CSng(cislo1)
cislo2 = CSng(cislo2)
soucet = cislo1+cislo2
soucin = cislo1*cislo2
MsgBox "Součet = " & soucet, vbOKOnly + vbInformation, "Výsledek"
MsgBox "Součin = " & soucin, vbOKOnly + vbInformation, "Výsledek"

Všimněte si:
- cislo1 = CSng(cislo1) - tento příkaz říká skriptu, že vložený vstup bude číslo.
1. Jaké výsledky dostanu, pokud řádky s CSng odstraním?
2. Dokážete říct, proč tomu tak je?
To by bylo k proměnným vše. V dalším díle si povíme něco o větvení programu na základě podmínek a o cyklech.
Odkazy:
Ovládáme (nejen) windows pomocí visual basic script 1. díl
Ovládáme (nejen) windows pomocí visual basic script 2. díl
Ovládáme (nejen) windows pomocí visual basic script 3. díl
Ovládáme (nejen) windows pomocí visual basic script 4. díl
Ovládáme (nejen) windows pomocí visual basic script 5. díl
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Reklama
  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů