Windows Script

De Cacauet Wiki
Dreceres ràpides: navegació, cerca

També conegut com a WSH (Windows Script Host) és una forma de realitzar scripts en Windows utilitzant algun dels llenguatges compatibles amb Microsoft, típicament (però no només) Visual Basic. Aquest article el farem en Visual Basic que resulta molt útil per la seva senzillesa.


Intro[modifica]

No cal tenir instal·lat res en particular. Windows és capaç d'executar els arxius amb extensió .vbs . Recordeu, això sí, de treure el setting de l'explorador de Windows de "Amagar extensions pels tipus d'arxiu coneguts", i així poder renombrar els nostres arxius amb l'extensió VBS.

Es recomana, això sí, algun editor de text amb syntax highlighting com el típic Notepad++. Com a alternativa a Visual Studio (és molt pesat i de pagament) hi ha una versió més "lite": Visual Studio Code, fins i tot està per a Linux!

Referències:


Primeres passes[modifica]

Edita un arxiu prova1.vbs amb el teu editor favorit i posa-hi:

 'això és un comentari
 rem Això és un altre comentari
 
 Wscript.echo "holaaaaa"

Ara, per executar-ho per línia de comandes només caldrà que fem:

> cscript prova1.vbs

Si el volem executar en mode visual, podem fer-hi un doble-click o bé executar

> wscript prova1.vbs


Strings[modifica]

Tricky things dels Strings en VB: en VB.NET tenim un tractament de Strings com a objecte. Però en VBS, que és el nostre cas, no disposem d'aquesta funcionalitat, ULL amb quines pàgines consultem perquè no ens funcionarà el codi. Disposem del tipus de dades bàsic String i podem treballar-ho amb una sèrie de funcions elementals no orientades a objecte:

Concatenació amb "&":

frase = "hola què tal"
frase = frase & ", Manel?"
WScript.Echo frase    'obtenim: > "hola què tal, Manel?"

Substring amb la funció "Mid":

frase = "hola què tal"
WScript.Echo Mid(frase,6,3)    'obtenim: > "què"


Arrays[modifica]

Teniu un bon article explicant els arrays aquí.

Bàsicament cal recordar:

  • Cal definir-los prèviament (amb DIM)
  • Dins d'un array es poden barrejar tipus de dades (a diferència de C), per exemple, integers i strings
  • Per saber la longitud d'un array (i per iterar) utilitzem la funció UBOUND
Dim arr(10)
arr(1) = "hola què tal?" 'un string
arr(5) = 3.14            'un float
arr(6) = 11              'un integer
WScript.Echo "el nostre array té " & UBound(arr) & " posicions"


Entrada i sortida[modifica]

Els típics mètodes d'entrada i sortida son:

  • Wscript.echo : per mostrar missatges. Utilitza una finestra o la consola depenent si hem executat wscript o cscript (text i variables es concatenen amb "&" o amb comes):
    Wscript.echo "el resultat és ", var1
  • Wscript.StdIn.ReadLine : per llegir dades de la consola.
    var2 = Wscript.StdIn.ReadLine
  • InputBox( prompt, [títol], [defecte], [x], [y] ) : finestra d'entrada de dades.
    var3 = InputBox("entra el màxim","entrada de dades")
  • MsgBox text, botons, títol : finestra de sortida de dades.
    • Botons:
      • 0 OK
      • 1 OK , Cancel
      • 2 Abort , Retry , Ignore
      • 3 Yes , No , Cancel
      • 4 Yes , No
      • 5 Retry , Cancel
    • Resultat del quadre:
      1. OK
      2. Cancel
      3. Abort
      4. Retry
      5. Ignore
      6. Yes
      7. No


Condicionals[modifica]

If[modifica]

If <condicio1> Then
   ...
   seqüència 1
   ...
Elseif <condicio2> Then
   ...
   seqüècia 2
   ...
Else
   ...
   seqüència 3
   ...
End if

Exemple:

If opcions = "verbose" Then
    Wscript.Echo "Processat l'arxiu " & arxiuActual
End If

Per operacions lògiques disposem de NOT, AND i OR:

finished = False
...
If opcions="verbose" AND NOT finished Then
    Wscript.Echo "Processat l'arxiu " & arxiuActual
End If

Case[modifica]

Ve a ser el switch de C:

Select Case <variable>
    Case <valor1>
       ...
       seqüència 1
       ...
    Case <valor2>
       ...
       seqüècia 2
       ...
    Case <valor3>
       ...
       seqüència 3
       ...
End Select

Exemple:

Select Case opcio2
    Case "start"
        startEngine()
    Case "stop"
        stopEngine()
End Select


Bucles[modifica]

Els bucles o loops tenen la següent sintaxi.

For[modifica]

El bucle bàsic basat en índex és aquest: (aprofitem per veure com definir un Array)

Dim numbers(4)
numbers(0) = 3.14
numbers(1) = 10
numbers(2) = 1234
numbers(3) = 36640
 
For i=0 To 3
    Wscript.Echo numbers(i)
Next

Es pot millorar utilitzant UBound:

For i=0 To UBound(numbers)
    Wscript.Echo numbers(i)
Next

La millor opció, però, és FOR EACH.

  • No necessitem saber la grandària de l'array/col·lecció
  • Obtenim directament el valor de l'element enlloc de l'index, fent la sintaxi més clara
'definim un array de 3 posicions
Dim frases(3)
'fixa't com utilitzar la dobles " per poder insertar el caràcter (") enmig d'un string
frase(0) = "ana a posar ""hola què tal?"" "
frase(1) = " ...però potser la tenim molt gastada."
frase(2) = "potser que ens busquem una altra, oi?"
 
For Each frase in frases
    Wscript.Echo frase
Next

While[modifica]

Hi ha 3 formes de fer el While

Condició d'entrada WHILE:

Do While Not final
    ...
    final = True
    ...
Loop

Condició de sortida WHILE:

Do
    ...
    final = True
    ...
Loop While Not final

Condició d'entrada UNTIL:

Do Until final
    ...
    final = True
    ...
Loop

Condició de sortida UNTIL:

Do
    ...
    final = True
    ...
Loop Until final

També ens queda el While històric de Basic (enlloc de tancar amb LOOP tanquem amb WEND):

While a<10
    ...
    a = a + 1
    ...
Wend


Funcions i procediments[modifica]

La diferència entre l'una i l'altre és que les funcions retornen un valor, mentre que els procediments no.

Procediment:

Sub esborra_arxius( arxius )
    ...
End Sub

Els procediment es criden SENSE PARÈNTESIS (encara que calgui passar paràmetres), per exemple:

esborra_arxius arxiu1

Funció:

Function busca_arxius( tipus, carpeta_origen )
    ...
   ' al final d'una funció és obligatori retornar algun valor
   ' enlloc del típic return farem servir el mateix nom de la funció
   busca_arxius = arrayArxius
End Function

Les funcions cal cridar-les AMB PARÈNTESIS:

busca_arxius( ".txt", "c:\Users" )


Objectes[modifica]

Llegiu POO Introducció.

En el cas de Windows Script disposarem de l'objecte Wscript que ens permetrà l'accés a les llibreries del sistema que ens interessen.

A la Referència MSDN podeu trobar els diversos objectes amb els què treballarem:

Un bon lloc per on començar és amb la llibreria d'accés al sistema d'arxius.


Exercicis[modifica]

Tots els exercicis han de tenir comentaris i estar correctament tabulats.

  1. Fes un joc d'endevinar un número entre 1 i 100. A cada intent l'usuari rebrà la informació de si el nombre introduït és major o menor.
  2. Crea un script que agafi els arxius d'una carpeta que li indiqui l'usuari, crei una altra carpeta amb el mateix nom +"(2)" i copii tots els arxius però amb les lletres en minúscules.
    Necessitaràs iterar pels diversos arxius d'un directori (Folder) com en aquest exemple.
  3. Crea un script que agafi imatges d'una carpeta i els separi en 2 carpetes: una pels JPG i una altra pels PNG
    Pista: utilitzeu la funció mid per fer substrings en combinació amb la funció len per saber la longitud del nom de l'arxiu.
  4. L'empresa Bollitos S.A. té una base de dades de clients en arxius de text dispersos tots dins d'una carpeta. Ens demana que li creem un script que passi tots els clients a format CSV separat per punt i coma.
    Utilitza l'objecte File i mira l'exemple que surt al mètode OpenAsTextStream per iterar per les diferents línies de l'arxiu.
    1. Ens demanarà el nom de la carpeta on hi ha els arxius de text i el nom de l'arxiu de sortida (.CSV).
    2. Els arxius tenen les següents dades, una a cada línia:
      • Nom de l'empresa
      • Nom de la persona de contacte
      • NIF
      • Adreça postal
      • Telèfon
      • Email
  5. Afegim contrasenyes a un CSV. Fes un script que agafi un arxiu CSV com el creat a l'exercici anterior (separat per ";").
    Probablement necessitaràs la funció SPLIT que la pots trobar en aquest resum de totes les funcions bàsiques de VB.
    1. Ens mostri el nom de cada empresa i ens demani si volem afegir una contrasenya.
    2. Si responem que sí, es crearà una contrasenya aleatòria de 8 caràcters i es guardarà com a últim element de la fila.
    3. Cal vigilar si ja existeix una contrasenya. En cas de que existeixi, la substituirem (no val amb afegir-la al final de la línia i prou).
  6. Fes un script que demani un nom d'arxiu i una paraula a l'usuari, i et digui si dins de l'arxiu hi ha la paraula.
    Utilitza la funció InStr que pots trobar a la llista de funcions de Basic.
  7. Fes un script que crei un arxiu .ZIP i hi comprimeixi tots els elements d'una carpeta que li passem per paràmetres al script.
    Fes també un script de UNZIP
  8. Fes un script que executi una comanda PING i desi tot els contingut de StdOut en un arxiu ping-out.txt
    Utilitza l'objecte Wscript.Shell. Quan executis la comanda mira't com accedir a StdOut, es pot llegir igual que un fitxer (amb ReadLine).