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: 23622
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 1359 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 1359 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 1359 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
  • Windows 11 nelze zrušit přihlášení pomocí hesla PIN)
    od nulka » 17 srp 2023 11:08 » v Windows 11, 10, 8...
    9
    3837
    od nulka Zobrazit poslední příspěvek
    17 srp 2023 16:02
  • Mazání souborů pomocí Scriptu
    od luko02420 » 04 kvě 2024 07:32 » v Vše ostatní (sw)
    25
    1741
    od luko02420 Zobrazit poslední příspěvek
    09 kvě 2024 10:12
  • Teamviewer - jak ovládat gps (pc) pomocí vzdálené podpory
    od Antonín » 27 bře 2024 14:35 » v Vše ostatní (sw)
    3
    2015
    od Antonín Zobrazit poslední příspěvek
    15 dub 2024 13:06
  • TAP-Windows 9.21.2 - error Příloha(y)
    od ski1961 » 11 kvě 2024 15:20 » v Windows 11, 10, 8...
    2
    523
    od faraon Zobrazit poslední příspěvek
    12 kvě 2024 09:00
  • Windows 11 a Bitlocker
    od AnnaLee123 » 05 úno 2024 10:45 » v Windows 11, 10, 8...
    3
    1225
    od petr22 Zobrazit poslední příspěvek
    05 úno 2024 13:24

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 1 host