Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Script VBS
Apostila Script VBS
Este artigo derivado do System Administration Scripting Guide, um novo livro que
ser publicado como parte do Windows .NET Server Resource Kit.
Quando combinado a tecnologias como a instrumentao de gerenciamento do
Windows (WMI) e as interfaces de servio do Active Directory (ADSI), o Microsoft
Visual Basic Scripting Edition (VBScript) torna-se uma linguagem de scripts
poderosa. Usando o VBScript juntamente com essas tecnologias, voc pode escrever
um script de aproximadamente 10.000 linhas, um script completo com tratamento de
erros, sub-rotinas e outras construes de programao avanadas. Por sua vez, esse
script fornece a voc controle completo sobre todos os aspectos do seu ambiente de
computao.
No entanto, o que torna o VBScript uma ferramenta to til para administradores de
sistema o fato de que no preciso criar solues to elaboradas e complicadas.
Reconhecidamente, scripts podem ser usados para criar uma soluo de
gerenciamento empresarial abrangente. Porm, talvez o mais importante seja o fato
de que os scripts tambm podem ser usados do seguinte modo: um administrador do
sistema pode gastar alguns minutos digitando algumas linhas de cdigo no Bloco de
Notas e criar instantaneamente uma soluo personalizada para um problema
especfico.
Por exemplo, o script de trs linhas mostrado na listagem 1 pode ser executado
sempre que voc precisar saber a quantidade de espao livre em disco disponvel na
unidade C do seu computador.
Listagem 1 Recuperando espao livre em disco com o VBScript
1 Set objWmiService = GetObject("winmgmts:")
2 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'")
3 WScript.Echo objLogicalDisk.FreeSpace
Se estiver enfrentado problemas com usurios que utilizam muito espao na unidade C
de seus computadores, agora voc tem uma soluo personalizada para identificar os
computadores com pouco espao livre em disco. Alm disso, voc pode desenvolver
Emitir uma notificao somente se uma unidade tiver pouco espao em disco.
Use GetObject para criar objetos WMI ou ADSI. Quando estiver utilizando
GetObject, use um identificador de origem para identificar o objeto a ser criado.
Um identificador de origem simplesmente uma seqncia de caracteres, com
um prefixo obrigatrio, que facilita a descrio do objeto de destino, da mesma
forma como um nome de arquivo e um caminho completo descrevem um
arquivo especfico no sistema de arquivos.
Estas no so regras fixas; algumas vezes voc precisar usar CreateObject para criar
objetos WMI que no sejam SWbemServices (por exemplo, SWbemDateTime). Alguns
objetos ADSI exigem, de forma semelhante, o uso de CreateObject. Porm, em geral,
CreateObject ser necessrio somente durante a criao de novas instncias de itens
como objetos de shell, de rede e de controlador do WSH, objetos de dicionrio,
FileSystemObject e o Internet Explorer, entre vrios outros objetos.
Objetos intrnsecos
Alguns objetos so intrnsecos. Objetos intrnsecos so os objetos criados sem nunca
ter sido necessrio efetuar uma chamada para GetObject ou CreateObject. No script
mostrado na listagem 2, o script conecta-se WMI usando este cdigo:
Set objWmiService = GetObject("winmgmts:")
Isso cria uma referncia, chamada objWmiService, ao objeto SwbemServices da
biblioteca de scripts WMI.
Observe que nenhuma seqncia de caracteres semelhante usada para criar uma
referncia ao objeto Wscript do WSH na listagem 2. Em vez disso, o mtodo Echo
chamado sem a criao anterior de qualquer tipo de objeto WSH. Isso ocorre porque
WScript um objeto intrnseco. No necessrio 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 intrnseco. O objeto Err ser criado
automaticamente quando ocorrer um erro no script. Examinaremos o objeto Err
posteriormente neste artigo.
Usando uma referncia de objeto
Com a automao, voc no trabalha diretamente com o prprio objeto. Em vez disso,
voc cria uma referncia ao objeto usando GetObject ou CreateObject e atribuindo o
objeto a uma varivel. Aps a criao dessa referncia, voc poder acessar os
mtodos e as propriedades do objeto usando a varivel e no o objeto propriamente
dito. Na listagem 2, GetObject usado para atribuir o objeto SWbemServices da WMI
varivel objWmiService. Depois que a atribuio for concluda, todos os mtodos e as
propriedades do objeto SWbemServices podero ser acessados atravs de
objWmiService. Por exemplo, na linha 2 do script, o mtodo Get usado para
recuperar as propriedades da unidade C.
Sempre que criar uma referncia de objeto, voc dever usar a palavra-chave Set
quando atribuir a referncia a uma varivel. Por exemplo, esta linha de cdigo
resultar em erro em tempo de execuo:
objWmiService = GetObject("winmgmts:")
Para criar a referncia do objeto, use a palavra-chave Set da seguinte maneira:
Set objWmiService = GetObject("winmgmts:")
Set s usada durante a criao de uma referncia de objeto. Se voc usar essa
palavra-chave para outros propsitos, como atribuir um valor a uma varivel, ocorrer
um erro em tempo de execuo. Por exemplo, esta linha de cdigo falhar, pois
nenhum objeto chamado y poder ser encontrado no computador:
Set x = y
Mtodos de chamada
Os objetos de automao 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, impossvel desenhar um
grfico usando somente o VBScript. No entanto, com a automao, voc pode utilizar
os recursos do Microsoft Excel e adicionar facilmente um grfico a, por exemplo, uma
pgina da Web.
Normalmente, os objetos de automao expem mtodos e propriedades (porm, no
h requisitos para que exponham nenhum dos dois). Os mtodos so equivalentes s
aes que os objetos podem executar. Por exemplo, embora o script da listagem 2
tenha somente trs linhas, ele usa a automao para acessar os mtodos de dois
objetos COM diferentes e, assim, executar duas aes distintas:
Depois de criar uma referncia a um objeto, voc poder chamar os mtodos desse
objeto usando a notao de pontos. A notao de pontos tem esse nome, pois voc
chama um mtodo digitando o nome da varivel que faz referncia ao objeto, um
ponto e o nome do mtodo (dependendo do mtodo, voc tambm poder digitar seus
parmetros). Geralmente, a notao de pontos tem a seguinte aparncia:
Referncia_de_Objeto.Nome_do_Mtodo
Na listagem 2, a chamada do mtodo Get de SWbemServices pode ser dividida
conforme mostrado na tabela 1.
Tabela 1
Item
Descrio
objWmiService
Referncia do objeto.
Get
Nome do mtodo.
Recuperando propriedades
Propriedades so atributos associados a um objeto. Elas so especialmente
importantes em scripts de administrao de sistemas, pois vrios dos objetos que voc
usa so representaes virtuais de objetos reais de sistema operacional e de
computador. Na listagem 2, a propriedade FreeSpace recuperada com a mesma
notao de pontos usada para chamar mtodos.
Isso pode parecer irrelevante, mas com a WMI, a referncia no algum algoritmo de
programao amorfo, mas sim a um disco rgido real no computador. Portanto, a
propriedade FreeSpace no somente uma propriedade de um objeto de automao;
ela uma propriedade da unidade C. De certa maneira, WMI cria um espelho virtual de
um objeto fsico real. Quando voc recupera as propriedades desse espelho virtual,
tambm recupera as propriedades do objeto fsico.
Variveis
O script mostrado na listagem 2 funciona exatamente como o esperado; quando
executado, ele relata o espao livre em disco na unidade C. Porm, isso no significa
que o script no possa ser aprimorado. Por exemplo, a propriedade FreeSpace informa
o nmero de bytes disponveis em uma unidade. Como unidades de disco so
normalmente medidas em gigabytes, quase sempre a propriedade FreeSpace retorna
um valor difcil de interpretar. Por exemplo, a figura 1 mostra o valor relatado para
uma unidade com aproximadamente 10 gigabytes de espao livre em disco.
Figura 1
Embora parea bvio que a unidade C possui espao em disco adequado, muito
menos bvio a quantidade de espao em disco realmente disponvel. Administradores
de sistema podem achar fcil interpretar os dados retornados pelo script, caso os
dados sejam relatados como megabytes em vez de bytes.
O VBScript inclui uma grande variedade de funes matemticas que permitem
executar aes, como a converso de bytes em megabytes. Alm disso, o VBScript
tambm fornece uma construo -- a varivel -- que pode ser usada para armazenar
os resultados dessas equaes matemticas. Variveis fornecem uma maneira de
armazenar qualquer tipo de dado enquanto o script est sendo executado.
Figura 2
Observao A equao usou o nmero 1048576 e no o nmero 1.048.576 (com
pontos para separar os milhares). Voc no pode usar pontos ou qualquer outro
caractere para separar milhares no VBScript. Em vez disso, voc deve executar todos
os dgitos juntos. Isso se aplica a nmeros embutidos em cdigo no script, bem como
Figura 3
Constantes
No script mostrado na listagem 3, a quantidade de megabytes livres calculada
atravs da diviso do valor da propriedade FreeSpace pelo valor embutido em cdigo
1048576 (valores embutidos em cdigo como esse so chamados de literais, pois
representam literalmente o valor e no variveis).
Em um script pequeno como esse (especialmente, um script pequeno escrito para seu
prprio uso), valores literais embutidos em cdigo no apresentam problemas. Porm,
Mais trabalho e mais risco de erro. Se voc tem certeza de que seu script
nunca ser alterado, talvez no seja relevante que o uso de literais possa ser
confuso. Porm, se houver possibilidade de alterao no script, os valores
literais no s sero confusos, como tambm exigiro mais trabalho para a
pessoa que estiver modificando o script. Por exemplo, considere que esse
mesmo procedimento -- converter quilobytes em megabytes -- seja usado 5 ou
6 vezes em um script. Se mais tarde voc decidir converter o valor em
gigabytes em vez de megabytes, voc ter de modificar corretamente cada
linha de cdigo em que ocorrer a converso. Se no fizer isso, o script no
fornecer resultados precisos.
Uma maneira de evitar os problemas que podem surgir devido ao uso de literais
utilizar constantes. Constantes so similares a variveis, pois ambas so locais para
armazenar dados. Porm, ao contrrio das variveis, as constantes, depois que so
definidas (isto , depois que um valor atribudo a elas), no podem ser modificadas
durante a execuo do script. Ao atribuir itens importantes, como o valor necessrio
para converter bytes em megabytes, a uma constante, voc pode garantir que o valor
permanecer o mesmo: um valor de constante no 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 atribudo a ela. Posteriormente no script (linha 4), o nmero de
bytes de espao livre em disco convertido no nmero de megabytes de espao livre
em disco. Em vez de usar o valor literal 1048576, a constante CONVERSION_FACTOR
utilizada. Ambas as equaes retornam o mesmo resultado; porm, mais fcil ler e
compreender a equao 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 benefcio da utilizao de constantes que elas podem ser definidas uma vez e
usadas vrias vezes no mesmo script. Por exemplo, uma verso expandida do script
mostrado na listagem 5 pode exigir que voc converta bytes em megabytes vrias
vezes durante a execuo do script. Em vez de usar o valor literal em cada equao,
use a constante. Se mais tarde voc decidir converter bytes em gigabytes, precisar
somente alterar o valor da constante; no ser necessrio alterar o valor usado em
cada equao.
Seqncias de caracteres
medida que voc escreve scripts cada vez mais sofisticados, comea a encontrar
tipos diferentes de dados (esse tpico abordado em mais detalhes no livro). Na
listagem 5, por exemplo, voc precisou usar dados numricos para atribuir o valor
literal 1048576 constante CONVERSION_FACTOR:
Const CONVERSION_FACTOR = 1048576
Essa linha de cdigo ser executada corretamente, pois um valor numrico est sendo
atribudo constante. Sempre que voc atribuir um valor numrico a uma varivel ou
a uma constante, digite o sinal de igual seguido do valor.
No entanto, resultados inesperados podero ocorrer se voc tentar atribuir um valor
alfanumrico (geralmente chamado de valor de seqncia de caracteres) usando a
mesma abordagem. Por exemplo, o cdigo a seguir tenta atribuir a seqncia de
caracteres atl-dc-01 varivel Computer e, em seguida, exibir o valor da varivel:
Computer = atl-dc-01
Wscript.Echo Computer
Quando esse script for executado, o valor mostrado na figura 4 ser exibido.
Figura 4
Menos o valor 01
Como atl e dc so exibidas como novas variveis que no foram inicializadas, o valor 0
ser atribudo a elas. Dessa forma, o VBScript interpretar essa linha de cdigo como
se estivesse escrita assim:
Computer = 0 - 0 - 1
Por isso a atribuio errnea de -1.
Quando voc atribui um valor de seqncia de caracteres a uma varivel ou a uma
constante, deve coloc-lo entre aspas duplas; essa a nica forma de assegurar que o
VBScript tratar a seqncia de caracteres como um valor alfanumrico e no como
uma varivel. Por exemplo, esse cdigo atribui corretamente a seqncia de caracteres
atl-dc-01 varivel Computer e, em seguida, exibe os resultados:
Computer = "atl-dc-01"
Wscript.Echo Computer
Quando esse script for executado, a seqncia de caracteres mostrada na figura 5 ser
exibida.
Figura 5
Seqncias de caracteres como variveis
Freqentemente, as seqncias de caracteres so usadas para atribuir valores a
variveis. Por exemplo, os scripts usados at agora neste captulo empregam o
seguinte cdigo para conectarem-se WMI:
Set objWmiService = GetObject("winmgmts:")
Sem explicar todos os detalhes da conexo com a WMI (para obter essas informaes,
consulte o captulo sobre a WMI no livro), esse cdigo sempre conecta voc ao
computador local. Isso suficiente, a menos que voc seja um administrador de
varivel e us-la no lugar de um valor embutido em cdigo. Por que isso importante?
Imagine que esse script foi criado para recuperar espao livre em disco de 100
computadores. Em vez de embutir em cdigo seqncias de caracteres separadas do
identificador de registro da WMI em cada computador, possvel criar uma nica
seqncia de caracteres com a varivel Computer. Em seguida, o script poder
executar essa nica seqncia de caracteres 100 vezes, a cada vez substituindo o
valor de Computer por um nome de computador diferente.
Porm, no momento, voc s precisa se concentrar na linha 3:
Set objWmiService = GetObject("winmgmts://" & Computer)
desta forma que o VBScript interpreta essa linha de cdigo:
1. O VBscript l tudo at a segunda aspa dupla. Em outras palavras:
Set objWmiService = GetObject("winmgmts://"
2. Ele l o E comercial, que significa basicamente "acrescentar o prximo item
seqncia de caracteres precedente". O que vem depois do E comercial a
varivel Computer, qual foi atribuda o valor atl-dc-01. O VBScript v a linha
da seguinte forma:
Set objWmiService = GetObject("winmgmts://atl-dc-01"
3. Ele l o caractere de parntese de fechamento. O VBScript exige que voc
tenha um nmero igual de parnteses de abertura e de fechamento. Se o
parntese de fechamento no estiver includo, voc receber uma mensagem
de erro. Agora, o VBScript l a linha de cdigo como
Set objWmiService = GetObject("winmgmts://atl-dc-01")
4. Aps chegar ao final da linha, o VBScript executa a instruo. Por sua vez, o
script se conecta ao servio WMI em atl-dc-01. Para conectar-se ao servio WMI
em um computador diferente, voc s precisa alterar o valor da varivel
Computer.
Concatenando seqncias de caracteres
Concatenao refere-se ao processo de combinar duas ou mais seqncias de
caracteres em uma nica seqncia de caracteres (tambm possvel combin-las
uma varivel chamada MessageEnd. Em seguida, voc pode ter concatenado as trs
variveis da seguinte maneira:
Wscript.Echo MessageStart & FreeMegaBytes & MessageEnd
Se voc observar as linhas 7 e 8, perceber que os espaos em branco foram
embutidos em cdigo nos valores da seqncia de caracteres "H " e " megabytes de
espao livre em disco.". Isso necessrio, pois o E comercial no insere espaos entre
os itens sendo concatenados. Por exemplo, exclua os espaos em branco, desta forma:
WScript.Echo "H" & FreeMegaBytes & "megabytes de espao livre em disco."
Nesse caso, a mensagem resultante executar os trs valores juntos, conforme
mostrado na figura 6.
Figura 6
Para formas simples de concatenao, voc pode evitar esse problema usando uma
vrgula em vez do E comercial para combinar os valores:
WScript.Echo "H", FreeMegaBytes, "megabytes de espao livre em disco."
Quando itens so separados por vrgula, um espao em branco inserido
automaticamente entre eles. Como resultado, a mensagem formatada de maneira
apropriada, conforme mostrado na figura 7.
Figura 7
Colees
At este ponto do artigo, os scripts foram criados para recuperar o espao livre na
unidade C de um computador especificado. Determinar o espao livre em uma nica
unidade uma tarefa administrativa comum, especialmente quando voc est
trabalhando com estaes de trabalho de usurios que possuem somente uma
unidade. Como a inteno era recuperar apenas o espao livre em disco da unidade C,
o DeviceID foi embutido em cdigo no script.
claro que, provavelmente, outros computadores -- incluindo a maioria dos servidores
-- possuem vrias unidades. Para esses computadores, a determinao do espao livre
na unidade C no informao suficiente; como administrador do sistema, voc
tambm precisa conhecer o espao 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.)
Porm, isso apresenta um problema imediato: como saber quais unidades esto
instaladas em um determinado computador? Teoricamente, voc pode verificar o
espao livre das unidades C a Z, mas, se um computador no possuir, por exemplo,
uma unidade E, o script falhar. Embora seja possvel incluir um cdigo criado para
tratar esses erros e impedir que o script falhe, o script resultante seria muito longo,
dificultando a sua leitura e a sua manuteno. Esse script especfico tambm seria
muito ineficiente; mesmo que um computador tivesse somente uma unidade, o script
tentaria recuperar o espao livre nas unidades D a Z inexistentes.
Felizmente, objetos de automao quase sempre retornam informaes na forma de
colees. Como colees de selos ou de moedas, essas colees de automao so
simples grupos de itens relacionados. Por exemplo, o script da listagem 8 usa o
mtodo InstancesOf da WMI (linha 4) para retornar no apenas uma unidade
especfica, mas uma coleo consistindo em todos os discos lgicos instalados no
computador. Se o computador tiver quatro unidades (C, D, E e F), a coleo ter
quatro itens, um para cada unidade.
Listagem 8 Usando colees
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 informaes retornadas como uma coleo significa que voc no precisa
antecipar quais unidades esto instaladas ou no em um computador. Em vez disso,
simplesmente pergunte pela coleo (todas as instncias de unidades de disco
instaladas no computador). Depois que a coleo tiver sido retornada, voc poder
usar um loop For Each (tambm conhecido como um loop de iterao) para examinar
cada item individual da coleo.
For Each
A instruo For Each fornece uma maneira simples de iterar todos os itens em uma
coleo (ou em uma matriz). Ao contrrio da instruo For (que ser abordada
posteriormente), For Each no exige que voc saiba quantos itens existem na coleo.
Em vez disso, ela inicia com o primeiro item da coleo (ou matriz) e continua at que
tenha efetuado um loop em cada item.
Um loop For Each tpico tem a seguinte aparncia:
For Each objLogicalDisk In colLogicalDisks
WScript.Echo objLogicalDisk.DeviceID
Next
Os itens individuais que compem esse loop so descritos na tabela 2.
Tabela 2
Item
Descrio
objLogicalDisk
colLogicalDisks
colLogicalDisks
Wscript.Echo
objLogicalDisk.DeviceID
Next
O script poder ter esta aparncia (o uso da instruo 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 "No 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 instruo For Each do VBScript. Embora
a instruo For Each seja a forma ideal de iterao atravs de uma coleo ou de uma
matriz, outros cenrios podem garantir uma construo de loop mais flexvel. Por
exemplo, scripts que monitoram ou medem recursos de sistema normalmente
precisam coletar dados em intervalos peridicos. improvvel que voc verifique o
espao livre em disco momentos aps instalar um novo disco rgido e depois nunca
mais verifique o espao livre ainda disponvel na unidade. Em vez disso, provvel
que voc verifique o espao 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 espao em
disco de maneira mais rpida do que outras estaes de trabalho do usurio).
13 End If
14 Next
Executando vrias aes usando If-Then-Else
O script mostrado na listagem 10 exibir uma mensagem de aviso se uma unidade
tiver pouco espao em disco. Porm, se a unidade de disco tiver espao livre
adequado, nenhuma mensagem ser exibida. Para um script simples de monitorao,
isso aceitvel. Por outro lado, o usurio que estivesse executando esse script, no
teria como saber se a falta de sada havia ocorrido porque todas as unidades possuam
espao em disco adequado ou porque a execuo do script havia falhado por algum
motivo.
Em outras palavras, s vezes necessrio que o script avalie uma condio e, em
seguida, execute uma ao diferente com base nessa avaliao. Por exemplo, talvez
voc deseje exibir uma mensagem de aviso quando a unidade tiver pouco espao em
disco e uma mensagem "Sem problemas" quando a unidade tiver espao em disco
adequado. Esse tipo de abordagem pode ser implementado com a instruo If-ThenElse.
A funo da instruo If-Then-Else est implcita em seu nome. Se (If) uma condio
for verdadeira (ou falsa), execute esta ao. Caso contrrio (Else), execute esta ao.
Se houver pouco espao em disco, ecoe uma mensagem de aviso. Caso contrrio, ecoe
a mensagem "Sem problemas".
Um exemplo disso mostrado na listagem 11. Na linha 11, o espao livre em disco de
uma unidade comparado a um limite de aviso. Se a instruo condicional for
verdadeira (isto , se o espao livre em disco for menor do que o limite de aviso), a
linha 12 ser executada.
E se a instruo condicional for falsa? Para lidar com essa possibilidade, uma clusula
Else foi includa na linha 13. Se a instruo condicional for falsa e a unidade tiver
espao adequado, a linha 14, linha imediatamente aps a clusula Else, ser
executada.
Listagem 11 Usando uma instruo If-Then-Else
1 Const CONVERSION_FACTOR = 1048576
2 Const WARNING_THRESHOLD = 100
3 Computer = "atl-dc-01"
4
5 Set objWmiService = GetObject("winmgmts://" & Computer)
alterar todas as 100 instncias, 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 espao livre em disco de cada um. Para fazer isso, devese colocar os nomes dos computadores em uma matriz, uma estrutura de dados que
pode ser usada praticamente da mesma forma que uma coleo.
O script mostrado na listagem 12 coloca os nomes de trs 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 informaes de espao livre em disco. Na linha 3, uma
matriz chamada Computers criada. Isso feito com a funo Array, atravs da
especificao dos nomes dos trs computadores como os parmetros da funo (os
nomes so colocados entre aspas, pois so seqncias 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 espao em disco."
16 End If
17 Next
18
19 Next
Embora matrizes possam parecer similares a colees, pelo menos no contexto da
instruo For Each, existe uma diferena importante. Uma matriz uma lista de
valores simples e indexada e uma coleo um objeto de automao, baseado em
COM e completamente desenvolvido. Isso afeta o modo como os dois tipos de lista so
criados e como itens de lista individuais podem ser acessados. Por exemplo, voc deve
usar a palavra-chave Set para criar uma coleo (linha 8) da mesma forma como faria
com qualquer objeto de automao. As matrizes no possuem esses requisitos, pois
no so objetos de automao.
Um nmero de ndice atribudo a cada elemento de uma matriz. No VBScript, o
nmero de ndice 0 atribudo ao primeiro elemento de uma matriz e os nmeros 1, 2,
3 etc. so atribudos aos elementos subseqentes. Logo, a matriz criada no script
anterior conteria os nmeros de ndice e os elementos mostrados na tabela 3. Observe
que o nmero de ndice mais alto ser sempre uma unidade menor do que o nmero
de elementos da matriz.
Tabela 3
Nmero de ndice Elemento
0
atl-dc-01
atl-dc-02
atl-dc-03
Voc pode usar esses nmeros de ndice para acessar elementos individuais na matriz.
Por exemplo, essa linha de cdigo exibir atl-dc-02, o valor do nmero 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 nmero de
ndice apropriado.
Mtodos adicionais para criar matrizes e acessar os elementos individuais dessas
matrizes so abordados no System Administration Scripting Guide.
Entrada
O script mostrado na listagem 12 foi criado para uma empresa que no espera
alteraes na infra-estrutura de computao, j que essa infra-estrutura j est
estabelecida. Uma infra-estrutura esttica como essa a exceo e no a regra. A
maioria das empresas possui um ambiente mais dinmico; embora somente trs
servidores (atl-dc-01, atl-dc-02, atl-dc-03) precisem de monitorao no momento, no
h garantias de que somente esses trs servidores precisaro de monitorao
posteriormente.
Itens embutidos em cdigo, como nomes de computador nos scripts, ocasionam dois
problemas relacionados:
Tratamento de erros
O script mostrado na listagem 13 bastante arriscado. Digamos que o usurio tenha
inserido um nome de servidor invlido como um argumento. Quando o script tentar se
conectar a esse computador inexistente, falhar e a mensagem de erro "The remote
server machine does not exist or is unavailable" ser exibida.
Claro que uma determinada porcentagem de risco inerente a todos os scripts usados
at o momento neste artigo, incluindo os scripts em que os nomes de computador
foram embutidos em cdigo. Afinal, o script no pode distinguir entre um nome de
computador invlido e um nome de computador vlido que, por algum motivo, no
est disponvel na rede. Por exemplo, digamos que voc execute o script da listagem
12 e que o computador chamado atl-dc-01 esteja off-line no momento. Neste ponto, o
script falhar e no ser mais processado. Isso significa que voc no s falhar ao
recuperar o espao livre em disco no computador atl-dc-01, como tambm falhar ao
recuperar o espao livre em disco nos computadores atl-dc-02 e atl-dc-03, mesmo que
eles estejam conectados rede e funcionando corretamente. Isso ocorre pois o script
finalizado antes de tentar se conectar a atl-dc-02 ou atl-dc-03.
A incapacidade em se conectar ao computador atl-dc-01 um exemplo de erro em
tempo de execuo, que ocorre aps o script ter sido iniciado (por comparao, um
erro de sintaxe, como uma palavra-chave incorreta, gerado e o script finalizado
antes que as linhas de cdigo sejam de fato executadas). Para obter ajuda na proteo
contra erros em tempo de execuo, voc pode incluir a instruo de tratamento de
erros do VBScript, On Error Resume Next, em seus scripts.
Sem o tratamento de erros, um script finalizado imediatamente quando encontra um
erro em tempo de execuo. Com o tratamento de erros, o script no finalizado, em
vez disso, ele tenta executar a linha seguinte do script. O script procede desta
maneira, ignorando as linhas que geram erros e executando as linhas que no geram
erros.
Tratamento de erros com o objeto Err
On Error Resume Next permite que o script continue funcionando caso ocorra um erro
em tempo de execuo. Porm, 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 no ter como saber onde houve falha.
Por outro lado, talvez voc prefira que um script no tente executar todas as linhas
caso ocorra erro em tempo de execuo. Por exemplo, considere um script que siga
este procedimento:
1. Conecta-se a um computador remoto.
2. Copia um conjunto de arquivos do computador local para o computador remoto.
3. Exclui o conjunto de arquivos original do computador local.
Digamos que voc tenha executado esse script, mas que o computador remoto no
esteja disponvel. Veja a seguir uma seqncia possvel de eventos.
1. O script tenta se conectar ao computador remoto e falha. Porm, On Error
Resume Next assegura que o script continue sendo executado.
2. O script tenta copiar arquivos para o computador remoto. A operao falha,
pois o computador remoto no est acessvel.
3. O script exclui os arquivos do computador local. Infelizmente, essa ao bemsucedida, pois o computador local est disponvel. Como resultado, os arquivos
so excludos do computador local, mas no so copiados para o computador
remoto.
Felizmente, voc pode usar o objeto Err intrnseco do VBScript para determinar se o
erro ocorreu ou no, e caso tenha ocorrido, para executar a ao apropriada.
O objeto Err criado automaticamente sempre que voc executa um script (h
somente um objeto Err por instncia de script). Esse objeto contm vrias
propriedades, incluindo as trs mostradas na tabela 4. Sempre que o script encontra
um erro em tempo de execuo, essas propriedades so preenchidas automaticamente
com as informaes que identificam o erro.
Tabela 4
Propriedade
Descrio
Description
Number
Valor
Err.Description
Err.Number
462
Err.Source
Limpando erros
A linha 15 do script usa o mtodo Clear para redefinir explicitamente as propriedades
do objeto Err. Isso importante, pois caso essa redefinio no ocorra, essas
propriedades s sero alteradas quando outro erro ocorrer. Os valores da propriedade
no so alterados quando no ocorrem erros. Como resultado, o script pode agir de
forma no apropriada com base na noo errnea de que ocorreu erro.
Isso o que acontecer se voc no redefinir explicitamente as propriedades do objeto
Err. Quando um script iniciado, o objeto Err apresenta o nmero padro 0 e as
propriedades de descrio e de origem vazias. Se o script no puder se conectar ao
computador atl-dc-01, as propriedades do objeto Err sero definidas como mostrado
na tabela 5.
Isso funciona conforme o esperado. Porm, o que acontece quando o computador
efetua um loop e tenta se conectar ao computador atl-dc-02? Nesse caso, a tentativa
bem-sucedida e nenhum erro gerado. No entanto, como nenhum erro foi gerado, o
objeto Err ainda contm os valores de propriedade mostrados na tabela 5, pois esse
objeto s atualizado quando ocorre um erro. Por sua vez, o script verifica que 462
o nmero do erro, o valor restante da tentativa malsucedida de conexo com o
computador atl-dc-01. Como 462 no igual a 0, o script executa uma ao com base
na deciso incorreta de que um erro ocorreu e, portanto, o computador atl-dc-02 deve
estar inacessvel. Esse mesmo problema ocorre quando o script tenta recuperar espao
livre em disco no computador atl-dc-03.
O mtodo Clear supera esse problema redefinindo o objeto Err para os valores padro
(number igual a 0, source e description definidas como vazio). Como os valores so
redefinidos, eles refletiro corretamente o fato de que nenhum erro ocorreu quando o
script tentar recuperar espao livre em disco para o computador atl-dc-02.
Aviso de iseno de responsabilidade da verso Beta
Esta documentao uma verso antecipada da documentao final e pode ser
alterada substancialmente antes da verso comercial final. Alm disso, informao
confidencial de propriedade da Microsoft Corporation. Ela divulgada conforme
descrito no acordo de no-divulgao estabelecido entre o adquirente e a Microsoft.
Este documento fornecido somente para fins informativos e a Microsoft no oferece