Output
Output
Output
Este artigo é derivado do System Administration Scripting Guide, um novo livro que
será publicado como parte do Windows .NET Server Resource Kit.
No entanto, o que torna o VBScript uma ferramenta tão útil para administradores de
sistema é o fato de que não é preciso criar soluções tão elaboradas e complicadas.
Reconhecidamente, scripts podem ser usados para criar uma solução de
gerenciamento empresarial abrangente. Porém, talvez o mais importante seja o fato
de que os scripts também podem ser usados do seguinte modo: um administrador do
sistema pode gastar alguns minutos digitando algumas linhas de código no Bloco de
Notas e criar instantaneamente uma solução personalizada para um problema
específico.
Por exemplo, o script de três linhas mostrado na listagem 1 pode ser executado
sempre que você precisar saber a quantidade de espaço livre em disco disponível na
unidade C do seu computador.
Se estiver enfrentado problemas com usuários que utilizam muito espaço na unidade C
de seus computadores, agora você tem uma solução personalizada para identificar os
computadores com pouco espaço livre em disco. Além disso, você pode desenvolver
essa solução personalizada usando somente o Bloco de Notas e só precisará digitar as
três linhas de código já mencionadas.
É claro que talvez esse script não atenda completamente às suas necessidades. Por
exemplo, o script só informa a respeito do espaço livre em disco disponível no seu
computador local; ele não pode informar a quantidade de espaço livre disponível em
um computador remoto. Da mesma forma, o script relata apenas o espaço livre
disponível na unidade C; ele não informa nada a respeito do espaço livre disponível
nas unidades D e E, por exemplo.
Porém, se o script não atender completamente às suas necessidades, ele poderá ser
facilmente modificado, sem que seja preciso iniciar um novo script a partir do zero.
Essa é outra vantagem do VBScript: é possível iniciar com um script muito simples e
adicionar recursos a ele à medida que suas necessidades forem mudando e você for se
tornando mais proficiente com a linguagem.
Este artigo foi criado para ilustrar o processo de se começar com um script básico e de
se adicionar, gradualmente, mais recursos sofisticados a ele. O artigo começa com o
script mostrado na listagem 1, um script que relata o espaço livre em disco na unidade
C. Seções subseqüentes usarão esse script simples de três linhas e gradualmente
adicionarão mais recursos para torná-lo mais útil em mais situações. Quando essa
série de aprimoramentos estiver completa, você terá um script que pode:
Criando objetos
Estas não são regras fixas; algumas vezes você precisará usar CreateObject para criar
objetos WMI que não sejam SWbemServices (por exemplo, SWbemDateTime). Alguns
objetos ADSI exigem, de forma semelhante, o uso de CreateObject. Porém, em geral,
CreateObject será necessário somente durante a criação de novas instâncias de itens
como objetos de shell, de rede e de controlador do WSH, objetos de dicionário,
FileSystemObject e o Internet Explorer, entre vários outros objetos.
Objetos intrínsecos
Alguns objetos são intrínsecos. Objetos intrínsecos são os objetos criados sem nunca
ter sido necessário efetuar uma chamada para GetObject ou CreateObject. No script
mostrado na listagem 2, o script conecta-se à WMI usando este código:
Set objWmiService = GetObject("winmgmts:")
Isso cria uma referência, chamada objWmiService, ao objeto SwbemServices da
biblioteca de scripts WMI.
Observe que nenhuma seqüência de caracteres semelhante é usada para criar uma
referência ao objeto Wscript do WSH na listagem 2. Em vez disso, o método Echo é
chamado sem a criação anterior de qualquer tipo de objeto WSH. Isso ocorre porque
WScript é um objeto intrínseco. Não é necessário criar um objeto Wscript, pois WScript
será criado automaticamente quando você executar um script de VBScript. O objeto de
erro do VBScript, Err, é outro objeto intrínseco. O objeto Err será criado
automaticamente quando ocorrer um erro no script. Examinaremos o objeto Err
posteriormente neste artigo.
Métodos de chamada
Os objetos de automação permitem usar os recursos dos objetos nos scripts. Por sua
vez, isso permite a você criar scripts mais úteis e poderosos do que faria se estivesse
restrito aos recursos da linguagem de scripts. Por exemplo, é impossível desenhar um
gráfico usando somente o VBScript. No entanto, com a automação, você pode utilizar
os recursos do Microsoft Excel e adicionar facilmente um gráfico a, por exemplo, uma
página da Web.
Normalmente, os objetos de automação expõem métodos e propriedades (porém, não
há requisitos para que exponham nenhum dos dois). Os métodos são equivalentes às
ações que os objetos podem executar. Por exemplo, embora o script da listagem 2
tenha somente três linhas, ele usa a automação para acessar os métodos de dois
objetos COM diferentes e, assim, executar duas ações distintas:
• O método Get, disponível através do objeto SWbemServices da WMI. O método
Get recupera informações do recurso gerenciado pela WMI especificado.
• O método Echo, disponível através do objeto WScript. O método Echo exibe
informações na tela. Se um script estiver sendo executado em uma janela de
prompt de comando e, portanto, sob Cscript.exe, essa informação será exibida
dentro dessa janela. Se o script estiver sendo executado sob Wscript.exe, a
informação será exibida em uma caixa de diálogo.
Depois de criar uma referência a um objeto, você poderá chamar os métodos desse
objeto usando a notação de pontos. A notação de pontos tem esse nome, pois você
chama um método digitando o nome da variável que faz referência ao objeto, um
ponto e o nome do método (dependendo do método, você também poderá digitar seus
parâmetros). Geralmente, a notação de pontos tem a seguinte aparência:
Referência_de_Objeto.Nome_do_Método
Na listagem 2, a chamada do método Get de SWbemServices pode ser dividida
conforme mostrado na tabela 1.
Tabela 1
Item Descrição
objWmiService Referência do objeto.
. Ponto (separa a referência do objeto e o nome do
método).
Get Nome do método.
("Win32_LogicalDisk.DeviceID='C:'") Parâmetro do método. Para o método Get, isso
pode ser lido como "Obtenha a instância da classe
Win32_LogicalDisk onde DeviceID é igual a C:".
Em vez de usar Wscript.Echo para exibir o espaço livre em disco, você pode usar a
função Msgbox do VBScript:
Msgbox objLogicalDisk.FreeSpace
Porém, neste artigo, usaremos Wscript.Echo e não Msgbox. Isso será feito porque a
função Msgbox sempre exibe as informações em uma caixa de diálogo gráfica. Quando
essa caixa de diálogo for exibida, você deverá clicar no botão OK antes que o script
prossiga.
Recuperando propriedades
Variáveis
Figura 1
Embora pareça óbvio que a unidade C possui espaço em disco adequado, é muito
menos óbvio a quantidade de espaço em disco realmente disponível. Administradores
de sistema podem achar fácil interpretar os dados retornados pelo script, caso os
dados sejam relatados como megabytes em vez de bytes.
O VBScript inclui uma grande variedade de funções matemáticas que permitem
executar ações, como a conversão de bytes em megabytes. Além disso, o VBScript
também fornece uma construção -- a variável -- que pode ser usada para armazenar
os resultados dessas equações matemáticas. Variáveis fornecem uma maneira de
armazenar qualquer tipo de dado enquanto o script está sendo executado.
Variáveis representam partes da memória disponíveis ao script durante sua execução.
Com essa finalidade, você pode pensar em memória de computador como sendo uma
série de pequenos compartimentos. Uma variável nada mais é do que um desses
compartimentos com um rótulo identificador anexado. Você pode armazenar qualquer
tipo de dado nesse compartimento e ter certeza de que o VBScript poderá recuperar os
dados se necessário. Quando você desejar fazer referência a esses dados, o VBScript
simplesmente procurará o endereço da memória e relatará as informações lá
armazenadas.
Usando variáveis
Como outras linguagens de script comuns, as variáveis do VBScript podem ser criadas
e usadas imediatamente em qualquer ponto de um script. Você não precisa se
preocupar em declarar ou inicializar uma variável antes de usá-la. (Por outro lado, há
algumas vantagens em declarar e inicializar variáveis antes de usá-las. Para obter
detalhes, consulte o System Administration Scripting Guide.)
Na linha 3 da listagem 3, uma variável chamada FreeMegabytes é usada para
armazenar os resultados da divisão de FreeSpace por 1048576 (o valor necessário
para converter bytes em megabytes). Assim que a linha 3 for executada, a variável
FreeMegabytes assumirá o valor dessa equação. Se for necessário fazer referência ao
número de megabytes de espaço livre em disco em qualquer outro local do script, você
não precisará repetir essa equação. Em vez disso, simplesmente faça referência à
variável FreeMegabytes. Isso é mostrado na linha 4, onde o valor da variável é exibido
para a tela.
Listagem 3 Usando variáveis
1 Set objWmiService = GetObject("winmgmts:")
2 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'")
3 FreeMegaBytes = objLogicalDisk.FreeSpace / 1048576
4 WScript.Echo FreeMegaBytes
A Figura 2 mostra o valor relatado como megabytes.
Figura 2
Observação A equação usou o número 1048576 e não o número 1.048.576 (com
pontos para separar os milhares). Você não pode usar pontos ou qualquer outro
caractere para separar milhares no VBScript. Em vez disso, você deve executar todos
os dígitos juntos. Isso se aplica a números embutidos em código no script, bem como
números inseridos como um argumento de linha de comando ou como resposta a
qualquer tipo de solicitação.
Modificando variáveis
Figura 3
Constantes
Uma maneira de evitar os problemas que podem surgir devido ao uso de literais é
utilizar constantes. Constantes são similares a variáveis, pois ambas são locais para
armazenar dados. Porém, ao contrário das variáveis, as constantes, depois que são
definidas (isto é, depois que um valor é atribuído a elas), não podem ser modificadas
durante a execução do script. Ao atribuir itens importantes, como o valor necessário
para converter bytes em megabytes, a uma constante, você pode garantir que o valor
permanecerá o mesmo: um valor de constante não pode ser alterado, nem
inadvertidamente nem de qualquer outra forma.
Na listagem 5, uma constante chamada CONVERSION_FACTOR é definida na linha 1 e
o valor 1048576 é atribuído a ela. Posteriormente no script (linha 4), o número de
bytes de espaço livre em disco é convertido no número de megabytes de espaço livre
em disco. Em vez de usar o valor literal 1048576, a constante CONVERSION_FACTOR
é utilizada. Ambas as equações retornam o mesmo resultado; porém, é mais fácil ler e
compreender a equação da listagem 5.
Listagem 5 Usando constantes
1 Const CONVERSION_FACTOR = 1048576
2 Set objWmiService = GetObject("winmgmts:")
3 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'")
4 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR
5 FreeMegaBytes = Int(FreeMegaBytes)
6 WScript.Echo FreeMegaBytes
Outro benefício da utilização de constantes é que elas podem ser definidas uma vez e
usadas várias vezes no mesmo script. Por exemplo, uma versão expandida do script
mostrado na listagem 5 pode exigir que você converta bytes em megabytes várias
vezes durante a execução do script. Em vez de usar o valor literal em cada equação,
use a constante. Se mais tarde você decidir converter bytes em gigabytes, precisará
somente alterar o valor da constante; não será necessário alterar o valor usado em
cada equação.
Seqüências de caracteres
À medida que você escreve scripts cada vez mais sofisticados, começa a encontrar
tipos diferentes de dados (esse tópico é abordado em mais detalhes no livro). Na
listagem 5, por exemplo, você precisou usar dados numéricos para atribuir o valor
literal 1048576 à constante CONVERSION_FACTOR:
Const CONVERSION_FACTOR = 1048576
Essa linha de código será executada corretamente, pois um valor numérico está sendo
atribuído à constante. Sempre que você atribuir um valor numérico a uma variável ou
a uma constante, digite o sinal de igual seguido do valor.
No entanto, resultados inesperados poderão ocorrer se você tentar atribuir um valor
alfanumérico (geralmente chamado de valor de seqüência de caracteres) usando a
mesma abordagem. Por exemplo, o código a seguir tenta atribuir a seqüência de
caracteres atl-dc-01 à variável Computer e, em seguida, exibir o valor da variável:
Computer = atl-dc-01
Wscript.Echo Computer
Quando esse script for executado, o valor mostrado na figura 4 será exibido.
Figura 4
Como o valor -1 foi atribuído à variável Computer? Quando o VBScript encontra um
conjunto de caracteres alfanuméricos que não está entre aspas duplas, ele pressupõe
que os caracteres representam o nome de uma variável. Se ele vir um hífen "perdido",
presumirá que representa um sinal de menos. Como resultado, ele interpretará a linha
Computer = atl-dc-01 como à variável Computer será atribuído:
Como atl e dc são exibidas como novas variáveis que não foram inicializadas, o valor 0
será atribuído a elas. Dessa forma, o VBScript interpretará essa linha de código como
se estivesse escrita assim:
Computer = 0 - 0 - 1
Por isso a atribuição errônea de -1.
Quando você atribui um valor de seqüência de caracteres a uma variável ou a uma
constante, deve colocá-lo entre aspas duplas; essa é a única forma de assegurar que o
VBScript tratará a seqüência de caracteres como um valor alfanumérico e não como
uma variável. Por exemplo, esse código atribui corretamente a seqüência de caracteres
atl-dc-01 à variável Computer e, em seguida, exibe os resultados:
Computer = "atl-dc-01"
Wscript.Echo Computer
Quando esse script for executado, a seqüência de caracteres mostrada na figura 5 será
exibida.
Figura 5
4. Após chegar ao final da linha, o VBScript executa a instrução. Por sua vez, o
script se conecta ao serviço WMI em atl-dc-01. Para conectar-se ao serviço WMI
em um computador diferente, você só precisa alterar o valor da variável
Computer.
Figura 6
Para formas simples de concatenação, você pode evitar esse problema usando uma
vírgula em vez do E comercial para combinar os valores:
WScript.Echo "Há", FreeMegaBytes, "megabytes de espaço livre em disco."
Quando itens são separados por vírgula, um espaço em branco é inserido
automaticamente entre eles. Como resultado, a mensagem é formatada de maneira
apropriada, conforme mostrado na figura 7.
Figura 7
Coleções
Até este ponto do artigo, os scripts foram criados para recuperar o espaço livre na
unidade C de um computador especificado. Determinar o espaço livre em uma única
unidade é uma tarefa administrativa comum, especialmente quando você está
trabalhando com estações de trabalho de usuários que possuem somente uma
unidade. Como a intenção era recuperar apenas o espaço livre em disco da unidade C,
o DeviceID foi embutido em código no script.
É claro que, provavelmente, outros computadores -- incluindo a maioria dos servidores
-- possuem várias unidades. Para esses computadores, a determinação do espaço livre
na unidade C não é informação suficiente; como administrador do sistema, você
também precisa conhecer o espaço livre da unidade D, da unidade E e das outras
unidades instaladas no computador. (Na verdade, a classe Win32_LogicalDisk pode
identificar e retornar as propriedades de todos os tipos de unidade, incluindo
disquetes, CD-ROMs e unidades de rede mapeadas.)
Porém, isso apresenta um problema imediato: como saber quais unidades estão
instaladas em um determinado computador? Teoricamente, você pode verificar o
espaço livre das unidades C a Z, mas, se um computador não possuir, por exemplo,
uma unidade E, o script falhará. Embora seja possível incluir um código criado para
tratar esses erros e impedir que o script falhe, o script resultante seria muito longo,
dificultando a sua leitura e a sua manutenção. Esse script específico também seria
muito ineficiente; mesmo que um computador tivesse somente uma unidade, o script
tentaria recuperar o espaço livre nas unidades D a Z inexistentes.
Felizmente, objetos de automação quase sempre retornam informações na forma de
coleções. Como coleções de selos ou de moedas, essas coleções de automação são
simples grupos de itens relacionados. Por exemplo, o script da listagem 8 usa o
método InstancesOf da WMI (linha 4) para retornar não apenas uma unidade
específica, mas uma coleção consistindo em todos os discos lógicos instalados no
computador. Se o computador tiver quatro unidades (C, D, E e F), a coleção terá
quatro itens, um para cada unidade.
Listagem 8 Usando coleções
1 Const CONVERSION_FACTOR = 1048576
2 Computer = "atl-dc-01"
3 Set objWmiService = GetObject("winmgmts://" & Computer)
4 Set colLogicalDisks = objWmiService.InstancesOf("Win32_LogicalDisk")
5 For Each objLogicalDisk In colLogicalDisks
6 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR
7 FreeMegaBytes = Int(FreeMegaBytes)
8 WScript.Echo objLogicalDisk.DeviceID & " " & FreeMegaBytes
9 Next
Obter informações retornadas como uma coleção significa que você não precisa
antecipar quais unidades estão instaladas ou não em um computador. Em vez disso,
simplesmente pergunte pela coleção (todas as instâncias de unidades de disco
instaladas no computador). Depois que a coleção tiver sido retornada, você poderá
usar um loop For Each (também conhecido como um loop de iteração) para examinar
cada item individual da coleção.
For Each
A instrução For Each fornece uma maneira simples de iterar todos os itens em uma
coleção (ou em uma matriz). Ao contrário da instrução For (que será abordada
posteriormente), For Each não exige que você saiba quantos itens existem na coleção.
Em vez disso, ela inicia com o primeiro item da coleção (ou matriz) e continua até que
tenha efetuado um loop em cada item.
Um loop For Each típico tem a seguinte aparência:
For Each objLogicalDisk In colLogicalDisks
WScript.Echo objLogicalDisk.DeviceID
Next
Os itens individuais que compõem esse loop são descritos na tabela 2.
Tabela 2
Item Descrição
objLogicalDisk Variável que representa as instâncias de unidade de
disco individuais.
colLogicalDisks Nome dado à coleção de unidades de disco recuperada
com a WMI.
For Each objLogicalDisk in Inicia o loop. A sintaxe básica pode ser lida como
colLogicalDisks Instância For Each de um objeto em uma coleção de
objetos executa uma ação. Neste exemplo, isso pode
ser lido como "Para cada unidade de disco individual
na coleção de unidades de disco instalada neste
computador … "
Wscript.Echo Instruções executadas para cada unidade de disco na
objLogicalDisk.DeviceID coleção (neste exemplo, há somente uma instrução,
mas pode haver várias instruções entre as instruções
For Each e Next).
Observe que a referência a unidades de disco
individuais é feita com a variável objLogicalDisk e com
a propriedade adequada (neste caso, DeviceID). O
valor dessa propriedade será alterado todas as vezes
através do loop. Por exemplo, em um computador
com unidades C, D e E, objLogicalDisk.DeviceID será
igual a C na primeira iteração, pois C é o DeviceID da
primeira unidade da coleção. Em passagens
subseqüentes através do loop,
objLogicalDisk.DeviceID será igual a D e, em seguida,
a E.
Next Indica o final do loop. Depois de iterar cada item da
coleção, o script prosseguirá na linha após a instrução
Next. Se não houver linhas após essa instrução, o
script será finalizado.
É possível que uma coleção não contenha itens. Por exemplo, considere este script,
que retorna o conjunto de todas as unidades de fita instaladas em um computador:
Set objWmiService = GetObject("winmgmts:")
Set colTapeDrives = objWmiService.InstancesOf("Win32_TapeDrive")
For Each objTapeDrive In colTapeDrives
WScript.Echo objTapeDrive.Name
Next
Se esse script for executado em um computador sem unidades de fita, parecerá que
nada aconteceu. Na verdade, o script será executado conforme o esperado. Porém,
como o computador não possui uma unidade de fita, a coleção resultante de todas as
unidades de fita instaladas no computador não conterá itens. Quando executado em
um computador sem unidades de fita, o script irá:
Infelizmente, isso pode ser confuso: não existe maneira óbvia de saber se o script foi
executado ou não. Uma forma de aprimorar esse script é usar a propriedade Count
para determinar a quantidade de itens na coleção. Por exemplo, esse script usa a
propriedade Count para exibir o número de unidades de fita instaladas em um
computador:
Set objWmiService = GetObject("winmgmts:")
Set colTapeDrives = objWmiService.InstancesOf("Win32_TapeDrive")
Wscript.Echo colTapeDrives.Count
O seu script pode usar a propriedade Count para determinar o número de itens da
coleção e executar uma das seguintes opções:
O script poderá ter esta aparência (o uso da instrução If-Then-Else será explicado
posteriormente neste artigo):
Set objWmiService = GetObject("winmgmts:")
Set colTapeDrives = objWmiService.InstancesOf("Win32_TapeDrive")
If colTapeDrives.Count = 0 Then
Wscript.Echo "Não há unidades de fita instaladas neste computador."
Else
For Each objTapeDrive In colTapeDrives
WScript.Echo objTapeDrive.Name
Next
End If
Loop
Você já viu uma forma de loop quando usou a instrução For Each do VBScript. Embora
a instrução For Each seja a forma ideal de iteração através de uma coleção ou de uma
matriz, outros cenários podem garantir uma construção de loop mais flexível. Por
exemplo, scripts que monitoram ou medem recursos de sistema normalmente
precisam coletar dados em intervalos periódicos. É improvável que você verifique o
espaço livre em disco momentos após instalar um novo disco rígido e depois nunca
mais verifique o espaço livre ainda disponível na unidade. Em vez disso, é provável
que você verifique o espaço livre em disco em intervalos regulares, talvez uma vez por
semana, uma vez por dia, ou a de hora em hora, dependendo do computador que está
sendo monitorado (por exemplo, servidores de correio normalmente usam espaço em
disco de maneira mais rápida do que outras estações de trabalho do usuário).
Se houver um período de tempo relativamente longo entre coleções de dados, é
aconselhável executar o script como uma tarefa agendada. Dessa forma, você pode
agendar o script para ser executado todas as manhãs, às 2:00, e nunca mais se
preocupar com o assunto.
Porém, usar tarefas agendadas não é sempre uma opção. Por exemplo, digamos que
você deseje medir o uso do processador em um computador. Além disso, você deseja
medir esse uso a cada 10 segundos até coletar 500 amostras. Embora, teoricamente,
você possa criar 500 tarefas agendadas, uma após a outra, isso resulta em muito mais
trabalho. Uma abordagem mais adequada é executar um único script que colete todas
as 500 amostras.
Uma maneira de fazer com que um único script execute o mesmo conjunto de
comandos várias vezes é incluir esses comandos em um loop For. Com um loop For, é
possível executar um conjunto de comandos um determinado número de vezes.
Por exemplo, o script mostrado na listagem 9 verifica de hora em hora por 12 horas o
espaço livre em disco em um computador. Para isso, uma instrução For é usada na
linha 7 indicando que o loop deve ser executado 12 vezes. As linhas 8-14 representam
o corpo do loop For e determinam o espaço livre em disco de cada unidade de disco do
computador. A linha 14 interrompe o script por uma hora (por meio de uma constante
que interrompe o script por 3.600.000 milissegundos) e a linha 15 é simplesmente a
instrução Next, que marca o final do loop.
Quando o script for executado, uma conexão será estabelecida com o computador
remoto atl-dc-01. O script recuperará e exibirá as informações de espaço livre em
disco e, em seguida, fará uma interrupção de uma hora. Após o término dessa
interrupção, o script executará um loop e recuperará as informações sobre espaço livre
em disco uma segunda vez. Esse processo continuará até que as informações de
espaço em disco tenham sido recuperadas 12 vezes. Em seguida, o script executará a
linha de código após a instrução Next. Como não há linhas de código após essa
instrução, o script será finalizado.
Listagem 9 Executando comandos várias vezes
1 Const CONVERSION_FACTOR = 1048576
2 Const ONE_HOUR = 3600000
3 Computer = "atl-dc-01"
4
5 Set objWmiService = GetObject("winmgmts://" & Computer)
6
7 For i = 1 to 12
8 Set colLogicalDisk = objWmiService.InstancesOf("Win32_LogicalDisk")
9 For Each objLogicalDisk In colLogicalDisk
10 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR
11 FreeMegaBytes = Int(FreeMegaBytes)
12 WScript.Echo objLogicalDisk.DeviceID & " " & FreeMegaBytes
13 Next
14 Wscript.Sleep ONE_HOUR
15 Next
For
Tomando decisões
Matrizes
Coleções são uma forma excelente de empacotar informações, pois permitem trabalhar
com vários itens, mesmo que você não conheça os detalhes sobre esses itens. Por
exemplo, o script introduzido na listagem 8 permite recuperar o espaço livre em disco
de todas as unidades instaladas em um computador, mesmo que você não saiba
quantas unidades estão instaladas no computador. Para executar uma ação em cada
item da coleção, simplesmente use um loop For Each para iterar em toda a coleção e
execute a ação em todos os itens, um por um.
Objetos de automação podem criar coleções automaticamente. Porém, pode haver
outras informações, não retornadas por um objeto de automação, que serão mais
fáceis de manipular se você puder iterar no conjunto de itens um por um. Por exemplo,
digamos que você deseje verificar o espaço livre em disco disponível em três
computadores e não apenas em um. Você pode escrever o código para verificar o
primeiro computador, copiar e colar esse código e, em seguida, modificar o código
colado para verificar o espaço livre em disco no segundo computador. É possível
repetir esse processo para verificar o espaço livre em disco no terceiro computador.
Embora essa abordagem funcione, ela logo se tornará tediosa, especialmente se você
precisar verificar, por exemplo, 100 computadores. Além disso, digamos que você
precise alterar o código, talvez retornando não apenas o espaço livre na unidade, mas
também o tamanho total da unidade. Para fazer essa alteração, seria necessário
alterar todas as 100 instâncias, um processo que levaria muito tempo e aumentaria a
possibilidade de erro.
Uma abordagem mais adequada seria usar um loop For Each e percorrer uma lista de
computadores, verificando o espaço livre em disco de cada um. Para fazer isso, deve-
se colocar os nomes dos computadores em uma matriz, uma estrutura de dados que
pode ser usada praticamente da mesma forma que uma coleção.
O script mostrado na listagem 12 coloca os nomes de três computadores (atl-dc-01,
atl-dc-02 e atl-dc-03) em uma matriz e usa um loop For Each para conectar-se a cada
computador e recuperar as informações de espaço livre em disco. Na linha 3, uma
matriz chamada Computers é criada. Isso é feito com a função Array, através da
especificação dos nomes dos três computadores como os parâmetros da função (os
nomes são colocados entre aspas, pois são seqüências de caracteres). Na linha 5, um
loop For Each é usado para percorrer todos os elementos da matriz Computers.
Listagem 12 Usando matrizes
1 Const CONVERSION_FACTOR = 1048576
2 Const WARNING_THRESHOLD = 100
3 Computers = Array("atl-dc-01", "atl-dc-02", "atl-dc-03")
4
5 For Each Computer In Computers
6
7 Set objWmiService = GetObject("winmgmts://" & Computer)
8 Set colLogicalDisks = objWmiService.InstancesOf("Win32_LogicalDisk")
9
10 For Each objLogicalDisk In colLogicalDisks
11 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR
12 FreeMegaBytes = Int(FreeMegaBytes)
13 If FreeMegaBytes < WARNING_THRESHOLD Then
14 WScript.Echo Computer & " " & objLogicalDisk.DeviceID & _
15 " tem pouco espaço em disco."
16 End If
17 Next
18
19 Next
Embora matrizes possam parecer similares a coleções, pelo menos no contexto da
instrução For Each, existe uma diferença importante. Uma matriz é uma lista de
valores simples e indexada e uma coleção é um objeto de automação, baseado em
COM e completamente desenvolvido. Isso afeta o modo como os dois tipos de lista são
criados e como itens de lista individuais podem ser acessados. Por exemplo, você deve
usar a palavra-chave Set para criar uma coleção (linha 8) da mesma forma como faria
com qualquer objeto de automação. As matrizes não possuem esses requisitos, pois
não são objetos de automação.
Um número de índice é atribuído a cada elemento de uma matriz. No VBScript, o
número de índice 0 é atribuído ao primeiro elemento de uma matriz e os números 1, 2,
3 etc. são atribuídos aos elementos subseqüentes. Logo, a matriz criada no script
anterior conteria os números de índice e os elementos mostrados na tabela 3. Observe
que o número de índice mais alto será sempre uma unidade menor do que o número
de elementos da matriz.
Tabela 3
Número de índice Elemento
0 atl-dc-01
1 atl-dc-02
2 atl-dc-03
Você pode usar esses números de índice para acessar elementos individuais na matriz.
Por exemplo, essa linha de código exibirá atl-dc-02, o valor do número de índice 1 e o
segundo elemento da matriz:
Wscript.Echo Computers(1)
Para exibir o valor de um item diferente na matriz, substitua o valor 1 pelo número de
índice apropriado.
Métodos adicionais para criar matrizes e acessar os elementos individuais dessas
matrizes são abordados no System Administration Scripting Guide.
Entrada
O script mostrado na listagem 12 foi criado para uma empresa que não espera
alterações na infra-estrutura de computação, já que essa infra-estrutura já está
estabelecida. Uma infra-estrutura estática como essa é a exceção e não a regra. A
maioria das empresas possui um ambiente mais dinâmico; embora somente três
servidores (atl-dc-01, atl-dc-02, atl-dc-03) precisem de monitoração no momento, não
há garantias de que somente esses três servidores precisarão de monitoração
posteriormente.
Itens embutidos em código, como nomes de computador nos scripts, ocasionam dois
problemas relacionados:
• Falta de flexibilidade. O script da listagem 12 recuperará somente
informações sobre o espaço em disco disponível nos computadores atl-dc-01,
atl-dc-02 e atl-dc-03. Se você precisar recuperar espaço livre em disco para o
computador atl-dc-04, será necessário modificar o script.
• Atualizações freqüentes. O script da listagem 12 foi criado para recuperar
informações sobre o espaço livre em disco de um conjunto específico de
computadores (por exemplo, todos os controladores de domínio em uma
localização específica). Sempre que um novo controlador de domínio for
adicionado ou sempre que um controlador de domínio existente for retirado, o
script precisará ser atualizado. Se você usar somente esse script em sua
empresa, isso talvez não cause problemas. Porém, se usar vários scripts, você
provavelmente perderá mais tempo modificando-os do que economizará
usando-os.
On Error Resume Next permite que o script continue funcionando caso ocorra um erro
em tempo de execução. Porém, isso pode causar pelo menos dois problemas. Por um
lado, nenhuma mensagem de erro é gerada para informar que ocorreu erro. Se
executar um script e nada ocorrer, você não terá como saber onde houve falha.
Por outro lado, talvez você prefira que um script não tente executar todas as linhas
caso ocorra erro em tempo de execução. Por exemplo, considere um script que siga
este procedimento:
Digamos que você tenha executado esse script, mas que o computador remoto não
esteja disponível. Veja a seguir uma seqüência possível de eventos.
Felizmente, você pode usar o objeto Err intrínseco do VBScript para determinar se o
erro ocorreu ou não, e caso tenha ocorrido, para executar a ação apropriada.
O objeto Err é criado automaticamente sempre que você executa um script (há
somente um objeto Err por instância de script). Esse objeto contém várias
propriedades, incluindo as três mostradas na tabela 4. Sempre que o script encontra
um erro em tempo de execução, essas propriedades são preenchidas automaticamente
com as informações que identificam o erro.
Tabela 4
Propriedade Descrição
Description Descrição do erro. A descrição pode ser usada para informar ao
usuário que ocorreu erro. Isso pode ser realizado com o eco do
valor:
Wscript.Echo Err.Description
Limpando erros
ActiveX & Scripting O ActiveX Scripting oferece muito mais do que apenas uma linguagem de scripting
para navegadores da Web. ActiveX é uma plataforma para desenvolvimento de qualquer quantidade de
linguagens de scripting para qualquer finalidade que os desenvolvedores da Web exijam. Usando os
serviços de scripting do ActiveX, uma linguagem de scripting pode ser implementada em qualquer
plataforma. O ActiveX Scripting é construído a partir de dois componentes principais básicos:
VBScript em outras Aplicações e Browsers Como um desenvolvedor, você tem licença para usar seus
códigos fontes em VBScript em suas aplicações. A Microsoft fornece implementações binárias do
VBScript em Windows 16-bits e 32-bits, e para o Macintosh®. VBScript é integrado com browsers da
World Wide Web. VBScript e ActiveX Scripting pode também ser usuados como uma línguagem geral em
outras aplicações.
<SCRIPT LANGUAGE="VBScript">
<!--
Function CanDeliver(Dt)
CanDeliver = (CDate(Dt) - Now()) > 2
End Function
-->
</SCRIPT>
<HTML>
<HEAD>
<TITLE>Place Your Order</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
Function CanDeliver(Dt)
CanDeliver = (CDate(Dt) - Now()) > 2
End Function
-->
</SCRIPT>
</HEAD>
<BODY>
...
Você pode usar blocos de SCRIPT em qualquer parte de uma página
HTML. Você pode colocá-lo na seção BODY e ou HEAD. Entretanto,
você provavelmente desejará colocar todo o código de scripting na
seção HEAD, com o intuito de organizá-lo. Guardando seu código na
seção HEAD você assegura que todo o código está sendo lendo e
decodificado antes de qualquer chamadas da seção BODY da página
HTML.
Um exceção notável para esta regra é que você pode desejar fornecer
código do inline scripting ao responder os eventos de objetos em seu
formulário. Por Exemplo, você pode embutir código do scripting para
responder a um clique no botão em um formulário:
<HTML>
<HEAD>
<TITLE>Test Button Events</TITLE>
</HEAD>
<BODY>
<FORM NAME="Form1">
<INPUT TYPE="Button" NAME="Button1" VALUE="Click">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
MsgBox "Button Pressed!"
</SCRIPT>
</FORM>
</BODY>
</HTML>
Tipos de Dados do VBScript O VBScript tem unicamente um tipo de dado chamado Variant. Um dado
Variant é uma espécie especial de tipo de dados que pode conter espécies diferentes de informação,
dependendo de como seja usado. Como Variant é o único tipo de dados do VBScript, este será também
o tipo de dado retornado pelas funções do VBScript.
Uma variável declarada como Variant pode conter um valor numérico, ou uma cadeia de caracter. Se
você está trabalhando com dados que compare números iguais, o VBScript assume que seu tipo de
dado é númerico.
Parecidamente, se você está comparando caracteres literais, o VBScript trata seus dados como string.
Você pode usar números como strings simplesmente cercando-os com aspas (" ").
Subtipos Variant
Além do tipo numérico ou string, uma Variant podem fazer distinções sobre uma natureza específica de
informação numérica. Por Exemplo, você pode ter informação numérica que representa uma data ou um
tempo. Certamente, você pode também ter uma variedade rica de informação numérica, essas
categorias diferentes de informação que pode ser contida em uma Variant são chamadas subtipos.
A seguinte tabela mostra os subtipos de dados que uma Variant pode conter:
Subtipo Descrição
Descrição Empty (Vazio) Valor igual a 0 para variáveis
numéricas ou ("") zero-comprimento
para variáveis string.
Null (Nulo) Variant contém intencionalmente
nenhum valor válido.
Boolean Contém False (falso) ou True
(Verdadeiro) um ou outro.
Byte Contém inteiro de 0 a 255.
Integer Contém inteiro de -32,768 a 32,767.
Currency 922,337,203,685,477.5808 a
922,337,203,685,477.5807.
Long Contém inteiro de -2,147,483,648 a
2,147,483,647.
Single 3.402823E38 a -1.401298E-45 para
valores negativos; 1.401298E-45 a
3.402823E38 para valores positivos.
Double Contém um duplicar-exatidão,
boiado-ponto número na série
1.79769313486232E308 para
4.94065645841247E-324 para
valores negativos;
4.94065645841247E-324 para
1.79769313486232E308 para
valores positivos.
Date (Tempo) Contém um número que representa
uma data entre 1 de Janeiro de 100
até 31 de Dezembro de 9999.
String Variáveis alfanuméricas, que podem
ter um comprimento de 0 até
aproximadamente 2 bilhões de
caracteres.
Object Qualquer referência de Objeto.
Error Contém um número de erro.
Você pode usar funções de conversão para converter dados de um subtipo para o outro. A função
VarType retorna informação sobre seus dados, e armazena dentro de uma Variant.
Por exemplo:
Dim DegreesFahrenheit
Você pode declarar variáveis múltiplas separando-as por vírgula. Por exemplo:
Você pode também declarar uma variável implicitamente simplesmente usando seu nome no script. O
que geralmente não é uma boa prática causando resultados inesperados no decorrer de seu script. Uma
ótima alternativa é usar a declaração Option Explicit com a finalidade de forçar todas as declarações de
variáveis. A declaração Option Explicit deve ser a primeira declaração em seu script.
Ter o primeiro caracter do nome da variável sendo uma letra Não deve exceder 255 caracteres.
Escopo e Existência de Variáveis O escopo de uma variável é determinado quando você a declara.
Quando você declara uma variável dentro de um procedimento, apenas o código dentro daquele
procedimento pode acessar ou muda o valor daquela variável. Isto é um escopo local e é chamado de
variável a nível-procedimento. Se você declara uma variável exteriomente a um procedimento, você faz
com que todos os procedimentos reconheçam aquela variável, isto é uma variável a nível-escrita.
Uma variável pública é apenas destruída quando ocorre o término do script. No caso da variável privada,
ou seja declarada dentro de um procedimento, sua destruição ocorre com o término da execução do
procedimento. As variáveis locais são usadas para uma determinada tarefa temporária, liberando assim
espaço de memória. Você pode declarar variáveis locais com o mesmo nome em vários procedimentos
diferentes pois, elas são apenas visíveis no momento da execução do procedimento.
A(10) = 55
SomeVariable = A(8)
...
Arrays não são limitados para uma única dimensão. Você pode ter 60
dimensões, embora a maioria das pessoas não compreendem mais
que três ou quatro dimensões. Dimensões múltiplas são declaradas
com números relativos a sua dimensão, separados por vírgula entre
parêntesis. No seguinte exemplo, a variável MyTable possui duas
dimensões consistindo de 6 filas e 11 colunas:
Dim MyArray()
ReDim AnotherArray()
ReDim MyArray(25)
...
O que é uma Constante? Uma constante é um nome significativo que é recebe um valor númerico ou
caracter. O VBScript define um número de constantes intrínsecas. Você pode obter informação sobre
essas constantes intrínsecas na Referência da Linguagem VBScript.
Criando ConstantesVocê pode criar constantes definidas pelo usuário no VBScript usando a
declaração Const. Usando a declaração Const, você pode criar constantes strings ou numéricas com
nomes significativos que designam seus valores literais. Por exemplo:
Note que a string literal é cercada entre aspas ou marcas de citação (" "). As aspas são caminho óbvio
para diferenciar valores de string de valores numéricos. Datas e valores do tempo são representados
tendo o sinal (#) cercando o valor. Por Exemplo:
Você pode desejar adotar um esquema específico para diferenciar constantes de variáveis. Este
procedimento evita durante a execução do script, ocorrer um engano e usar constantes como variáveis e
vice-versa. Por exemplo, você pôde usar prefixos "vb" ou "con" nos nomes de suas constantes, ou criar
sua própria nomeclatura. Diferenciando constantes de variáveis, você elimina a possibilidade de ocorrer
um erro ao desenvolver scripts mais complexos.
Operadores do VBScript
Precedência do Operador
Quando várias operações ocorrem em uma expressão, cada parte é
avaliada e resolvida em uma ordem predeterminada chamada
precedência do operador. Você pode usar parêntesis para alterar a
ordem de precedência e forçar a avaliação de algumas partes de uma
expressão. Operações dentro de parêntesis são sempre resolvidas
primeiro independendo da ordem de resolução dos operadores. Dentro
dos parêntesis, entretanto, a ordem de resolução dos operadores é
mantida.
Aritmética
Comparação
Lógico
Descrição
Símbolo
Descrição
Símbolo
Descrição
Símbolo
Exponenciação (^)
Igualdade (=)
Negação
Lógica
Not
Negação do Unary (-)
Desigualdade (<>)
Conjunção
Lógica
And
Multiplicação (*)
Menor que (<)
Disjunction
Lógico
Or
Divisão (/)
Maior que (>)
Exclusão
Lógica
Xor
Divisão Inteira (\)
Menor que Ou igual a (<=)
Equivalencia
Lógica
Eqv
Aritmética de Módulo
Mod
Maior que ou Igual a (>=)
Implicação
Lógica
Imp
Adição (+)
Equivalencia de Objeto
Is
Subtração (-)
Concatenação de String (&)