You are on page 1of 37

Manual do VBScript

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

essa soluo personalizada usando somente o Bloco de Notas e s precisar digitar as trs linhas de cdigo j mencionadas. claro que talvez esse script no atenda completamente s suas necessidades. Por exemplo, o script s informa a respeito do espao livre em disco disponvel no seu computador local; ele no pode informar a quantidade de espao livre disponvel em um computador remoto. Da mesma forma, o script relata apenas o espao livre disponvel na unidade C; ele no informa nada a respeito do espao livre disponvel nas unidades D e E, por exemplo. Porm, se o script no 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: possvel 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. Conceitos bsicos do VBScript Este artigo foi criado para ilustrar o processo de se comear com um script bsico e de se adicionar, gradualmente, mais recursos sofisticados a ele. O artigo comea com o script mostrado na listagem 1, um script que relata o espao livre em disco na unidade C. Sees subseqentes usaro esse script simples de trs linhas e gradualmente adicionaro mais recursos para torn-lo mais til em mais situaes. Quando essa srie de aprimoramentos estiver completa, voc ter um script que pode: Recuperar informaes sobre o espao livre em disco de qualquer computador de sua empresa, inclusive computadores remotos. Recuperar informaes sobre o espao livre em disco de vrios computadores. Recuperar informaes sobre o espao livre em disco de todas as unidades instaladas em um computador. Emitir uma notificao somente se uma unidade tiver pouco espao em disco. Continuar funcionando caso um usurio digite um nome de computador invlido ou caso um computador no esteja disponvel na rede. medida que os novos recursos forem adicionados ao script, as construes do VBScript necessrias para fornecer esses aprimoramentos tambm sero brevemente

explicadas. (No captulo do System Administration Scripting Guide do qual esse arquivo derivado, essas construes so explicadas em mais detalhes.) Trabalhando com objetos O VBScript permite a administradores do sistema criar scripts complexos usando recursos de programao avanados, como rvores de deciso, loop, tratamento de erros e a capacidade de chamar funes e sub-rotinas. Porm, o VBScript no inclui funes intrnsecas execuo de tarefas de administrao de sistemas. O VBScript possui funes internas para a determinao da raiz quadrada de um nmero ou do valor ASCII de um caractere, mas no possui funes internas para a interrupo de servios, para a recuperao de eventos em logs de eventos ou para a execuo de outras tarefas do interesse de administradores de sistemas. Usando objetos COM Felizmente, h maneiras de se executar essas tarefas por meio de programao. Isso feito basicamente atravs do uso de objetos de automao. Objetos de automao so um subconjunto de COM (modelo de objeto componente), uma forma padro de aplicativos (arquivos .exe) ou bibliotecas de programao (arquivos .dll) apresentarem seus recursos como uma srie de objetos. Por sua vez, os programadores (ou escritores de script) podem utilizar esses objetos -- e os recursos do aplicativo ou da biblioteca de programao -- em seus prprios projetos. Por exemplo, um aplicativo de processamento de texto pode expor o verificador ortogrfico como um objeto de automao, fornecendo aos escritores de script uma maneira de adicionar a verificao ortogrfica a seus projetos. A capacidade de trabalhar com objetos de automao e utilizar as propriedades e os mtodos desses objetos torna o VBScript uma ferramenta poderosa para administrao de sistemas. O VBScript sozinho no pode ler eventos em um log; no entanto, ele pode usar os recursos includos na WMI para recuperar esses eventos. O VBScript no possui funes intrnsecas criao de contas de usurio no Active Directory; porm, a linguagem pode usar os recursos da ADSI para criar essas contas. Na verdade, o VBScript freqentemente chamado de "linguagem cola", pois uma de suas aplicaes principais "colar" objetos. Em vez de fornecer um nmero infinito de funes intrnsecas dedicadas administrao de sistemas, o VBScript fornece duas funes,

GetObject e CreateObject, e os elementos de linguagem necessrios para o uso dos mtodos e das propriedades de objetos de automao. O script mostrado na listagem 2 ilustra a importncia de objetos de automao no VBScript. Esse script relata a quantidade de espao livre em disco na unidade C do computador local. E, ainda, ele faz isso usando pouco cdigo VBScript. Em vez disso, o script: 1. Usa a funo VBScript GetObject para se conectar WMI atravs da biblioteca de scripts WMI (um objeto de automao). 2. Usa o mtodo Get, fornecido pelo objeto de automao WMI, para recuperar as propriedades da unidade C. 3. Usa o mtodo Echo do Windows Script Host (WSH) para relatar a quantidade de espao livre em disco na unidade C. Alis, WSH apenas outro objeto de automao. Listagem 2 Usando objetos no VBScript 1 Set objWmiService = GetObject("winmgmts:") 2 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'") 3 WScript.Echo objLogicalDisk.FreeSpace No exemplo anterior, o objetivo principal do VBScript era colar os recursos da WMI e do WSH. Isso permitiu a voc recuperar o espao livre em disco (algo que o WSH no pode fazer sozinho) e exibir o valor de volta para a tela (algo que a WMI no pode fazer sozinha). Criando objetos Antes de utilizar os mtodos ou as propriedades de um objeto de automao, voc deve obter uma referncia ao objeto, um processo conhecido como criar ou determinar o objeto. Criar objetos pode parecer confuso primeira vista, pois o VBScript e o WSH fornecem os mtodos CreateObject e GetObject para acessar objetos. Alm disso, embora as implementaes sejam semelhantes, h algumas diferenas sutis que crescem em importncia medida que voc se torna proficiente em scripts. Essas diferenas so discutidas em mais detalhes no livro. Por enquanto, use as seguintes diretrizes prticas sem se preocupar com o fato de estar usando as funes do VBScript ou os mtodos do WSH (porm, na maioria dos casos, voc usar as funes do VBScript):

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.

Use CreateObject para criar objetos que no sejam WMI ou ADSI. CreateObject usa um identificador por meio de programao, ProgID, para identificar o objeto a ser criado. Um ProgID a seqncia de caracteres fixa que um objeto adiciona ao Registro quando o objeto instalado e registrado no computador. Prefixos de identificador de origem tambm so armazenados no Registro.

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:

O mtodo Get, disponvel atravs do objeto SWbemServices da WMI. O mtodo Get recupera informaes do recurso gerenciado pela WMI especificado. O mtodo Echo, disponvel atravs do objeto WScript. O mtodo Echo exibe informaes na tela. Se um script estiver sendo executado em uma janela de prompt de comando e, portanto, sob Cscript.exe, essa informao ser exibida dentro dessa janela. Se o script estiver sendo executado sob Wscript.exe, a informao ser exibida em uma caixa de dilogo.

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 objWmiService . Descrio Referncia do objeto. Ponto (separa a referncia do objeto e o nome do mtodo). Get Nome do mtodo.

("Win32_LogicalDisk.DeviceID='C:'") Parmetro do mtodo. Para o mtodo Get, isso pode ser lido como "Obtenha a instncia da classe Win32_LogicalDisk onde DeviceID igual a C:". Uma observao sobre Wscript.Echo Em vez de usar Wscript.Echo para exibir o espao livre em disco, voc pode usar a funo Msgbox do VBScript: Msgbox objLogicalDisk.FreeSpace Porm, neste artigo, usaremos Wscript.Echo e no Msgbox. Isso ser feito porque a funo Msgbox sempre exibe as informaes em uma caixa de dilogo grfica. Quando essa caixa de dilogo for exibida, voc dever clicar no boto OK antes que o script prossiga.

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.

Variveis representam partes da memria disponveis ao script durante sua execuo. Com essa finalidade, voc pode pensar em memria de computador como sendo uma srie de pequenos compartimentos. Uma varivel nada mais do que um desses compartimentos com um rtulo identificador anexado. Voc pode armazenar qualquer tipo de dado nesse compartimento e ter certeza de que o VBScript poder recuperar os dados se necessrio. Quando voc desejar fazer referncia a esses dados, o VBScript simplesmente procurar o endereo da memria e relatar as informaes l armazenadas. Usando variveis Como outras linguagens de script comuns, as variveis do VBScript podem ser criadas e usadas imediatamente em qualquer ponto de um script. Voc no precisa se preocupar em declarar ou inicializar uma varivel antes de us-la. (Por outro lado, h algumas vantagens em declarar e inicializar variveis antes de us-las. Para obter detalhes, consulte o System Administration Scripting Guide.) Na linha 3 da listagem 3, uma varivel chamada FreeMegabytes usada para armazenar os resultados da diviso de FreeSpace por 1048576 (o valor necessrio para converter bytes em megabytes). Assim que a linha 3 for executada, a varivel FreeMegabytes assumir o valor dessa equao. Se for necessrio fazer referncia ao nmero de megabytes de espao livre em disco em qualquer outro local do script, voc no precisar repetir essa equao. Em vez disso, simplesmente faa referncia varivel FreeMegabytes. Isso mostrado na linha 4, onde o valor da varivel exibido para a tela. Listagem 3 Usando variveis 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 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

nmeros inseridos como um argumento de linha de comando ou como resposta a qualquer tipo de solicitao. Modificando variveis Provavelmente, o valor 10340.4458007813 (significando 10.340 megabytes de espao livre) muito mais significativo para o administrador de sistema tpico do que o valor 10842824704. Porm, pode-se argumentar que os nmeros aps o ponto decimal no contm muitas informaes teis. Felizmente, o VBScript fornece vrias maneiras diferentes para voc modificar os dados armazenados em variveis. Por exemplo, a funo Int retorna a parte inteira de um nmero, deixando de fora todos os dgitos aps o ponto decimal. Portanto, voc pode usar a funo Int para modificar o valor decimal armazenado no compartimento FreeMegaBytes, conforme mostrado na linha 4 da listagem 4. Listagem 4 Modificando variveis 1 Set objWmiService = GetObject("winmgmts:") 2 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'") 3 FreeMegaBytes = objLogicalDisk.FreeSpace / 1048576 4 FreeMegaBytes = Int(FreeMegaBytes) 5 WScript.Echo FreeMegaBytes A funo Int recupera o valor decimal original, descarta todos os dgitos aps o ponto decimal e retorna somente a parte inteira arredondada do nmero, que sobrescreve o valor original armazenado no compartimento FreeMegaBytes (varivel). Quando o script da listagem 4 for executado, FreeMegaBytes ser relatado como um nmero inteiro, conforme mostrado na figura 3.

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,

talvez seja necessrio um script maior, especialmente um script usado na configurao de empresas. Nessas situaes, literais podem resultar em, pelo menos, dois problemas: Confuso. Em um script pequeno, pode estar evidente que 1048576 o valor necessrio para converter bytes (o valor retornado da propriedade FreeSpace) em megabytes. Em um script maior, que inclua vrias equaes matemticas, isso pode no estar to evidente. Esse problema ocorre principalmente em configuraes de empresas, onde vrios administradores podem usar -- e modificar -- o mesmo script. Embora seja fcil para voc saber o que 1048576 representa, talvez no seja to evidente para outro administrador encarregado de modificar o script. 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

Como o valor -1 foi atribudo varivel Computer? Quando o VBScript encontra um conjunto de caracteres alfanumricos que no est entre aspas duplas, ele pressupe que os caracteres representam o nome de uma varivel. Se ele vir um hfen "perdido", presumir que representa um sinal de menos. Como resultado, ele interpretar a linha Computer = atl-dc-01 como varivel Computer ser atribudo: O valor da varivel atl Menos o valor da varivel dc 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

sistema responsvel pelo gerenciamento de alguns computadores remotos. Nesse caso, aconselhvel usar um script que possa recuperar o espao livre em disco de um computador remoto. Isso permitir a voc verificar, a partir da sua estao de trabalho, o espao em disco disponvel em qualquer computador sob o seu controle. Com a WMI, possvel conectar-se a um computador remoto simplesmente incluindo o nome do computador como parte do identificador de origem GetObject. Por exemplo, esta linha de cdigo conecta voc ao servio WMI no computador remoto atl-dc-01: Set objWmiService = GetObject("winmgmts://atl-dc-01") Voc pode usar o cdigo precedente para escrever um script que faa a conexo com o computador remoto. Porm, em uma configurao de empresa, talvez voc deseje um script mais flexvel que possa conectar-se a qualquer computador remoto. Para isso, edite o script sempre que execut-lo, substituindo o nome embutido em cdigo do computador pelo nome embutido em cdigo do computador de destino. Uma alternativa ainda melhor fornecer alguma maneira para o script aceitar entradas quando estiver sendo executado e assim operar, por exemplo, em um computador inserido como um argumento de linha de comando. A entrada do usurio ser discutida posteriormente neste artigo. No entanto, antes de comear essa discusso, importante compreender como os valores de seqncia de caracteres (como nomes de computador) podem ser atribudos a uma varivel e, em seguida, utilizados como parte do cdigo de script. Por exemplo, na linha 2 da listagem 6, o valor da seqncia de caracteres atl-dc-01 atribudo varivel Computer. Na linha 3, essa varivel usada para fazer a conexo com o servio WMI no computador atl-dc-01. Porm, isso no feito embutindo-se em cdigo o valor atl-dc-01 no identificador de registro, mas sim atravs do valor da varivel Computer. Listagem 6 Usando seqncias de caracteres 1 Const CONVERSION_FACTOR = 1048576 2 Computer = "atl-dc-01" 3 Set objWmiService = GetObject("winmgmts://" & Computer) 4 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'") 5 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 6 FreeMegaBytes = Int(FreeMegaBytes) 7 WScript.Echo FreeMegaBytes Em um pequeno script de demonstrao como esse, usar uma varivel para o nome do computador provavelmente exige mais esforo do que embutir o valor em cdigo. Porm, esse script ilustra um conceito importante: voc pode atribuir um valor a uma

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

com valores numricos ou de datas). A concatenao usada com freqncia para fornecer sada mais significativa e legvel. Por exemplo, o script mostrado na listagem 4 retorna um valor como 10340. Essa informao bastante til, desde que voc tenha certeza de que o script foi desenvolvido para retornar o nmero de megabytes de espao livre em disco da unidade C. Caso voc no conhea a funo do script, a sada ser sem sentido. Entre outras funes, a concatenao ajuda a fornecer contexto para sua sada de script. Por exemplo, em vez de exibir o valor 10340, aconselhvel exibir uma mensagem similar a "H 10340 megabytes de espao livre em disco". Para fazer isso, voc pode combinar os trs itens a seguir: "H ", uma seqncia de caracteres simples representando o incio da mensagem. FreeMegaBytes, a varivel contendo o nmero de megabytes livres na unidade. " megabytes de espao livre em disco.", uma segunda seqncia de caracteres representando o final da mensagem. Conforme mostrado nas linhas 3, 7 e 8 da listagem 7, voc concatena itens no VBScript usando o E comercial (&). Listagem 7 Concatenando seqncias de caracteres 1 Const CONVERSION_FACTOR = 1048576 2 Computer = "atl-dc-01" 3 Set objWmiService = GetObject("winmgmts://" & Computer) 4 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DeviceID='C:'") 5 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 6 FreeMegaBytes = Int(FreeMegaBytes) 7 WScript.Echo "H " & FreeMegaBytes & _ 8 " megabytes de espao livre em disco." Observao O sublinhado (_) no final da linha 7 conhecido como o caractere de continuao de linha e usado para indicar uma quebra na instruo. Isso significa que as linhas 7 e 8 devem ser tratadas como uma nica linha. Por ser muito grande para caber no espao reservado, a linha foi quebrada. As quebras de instruo so abordadas em mais detalhes no livro. Como alternativa, voc pode ter atribudo o valor "H " a uma varivel chamada MessageStart e a seqncia de caracteres " megabytes de espao livre em disco." a

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 objLogicalDisk Descrio Varivel que representa as instncias de unidade de disco individuais. colLogicalDisks Nome dado coleo de unidades de disco recuperada com a WMI. For Each objLogicalDisk in colLogicalDisks Inicia o loop. A sintaxe bsica pode ser lida como Instncia For Each de um objeto em uma coleo de objetos executa uma ao. Neste exemplo, isso pode ser lido como "Para cada unidade de disco individual na coleo de unidades de disco instalada neste computador " Wscript.Echo objLogicalDisk.DeviceID Instrues executadas para cada unidade de disco na coleo (neste exemplo, h somente uma instruo, mas pode haver vrias instrues entre as instrues For Each e Next). Observe que a referncia a unidades de disco individuais feita com a varivel objLogicalDisk e com a propriedade adequada (neste caso, DeviceID). O valor dessa propriedade ser alterado todas as vezes atravs do loop. Por exemplo, em um computador com unidades C, D e E, objLogicalDisk.DeviceID ser igual a C na primeira iterao, pois C o DeviceID da primeira unidade da coleo. Em passagens subseqentes atravs 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 coleo, o script prosseguir na linha aps a instruo Next. Se no houver linhas aps essa instruo, o script ser finalizado.

Colees sem itens possvel que uma coleo no 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. Porm, como o computador no possui uma unidade de fita, a coleo resultante de todas as unidades de fita instaladas no computador no conter itens. Quando executado em um computador sem unidades de fita, o script ir: 1. Conectar-se ao servio WMI. 2. Recuperar a coleo de unidades de fita instalada no computador. 3. Configurar um loop For Each para percorrer toda a coleo, exibindo o nome de cada unidade de fita individual da coleo. Porm, como no h itens na coleo, o loop For Each e as instrues nele includas no sero de fato executados. Em vez disso, o loop For Each ser ignorado e o script ir para a primeira linha aps a instruo Next. Nesse script de exemplo, no h linhas de cdigo aps a instruo Next, logo, o script finalizado. Infelizmente, isso pode ser confuso: no existe maneira bvia de saber se o script foi executado ou no. Uma forma de aprimorar esse script usar a propriedade Count para determinar a quantidade de itens na coleo. Por exemplo, esse script usa a propriedade Count para exibir o nmero 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 nmero de itens da coleo e executar uma das seguintes opes: Exibir as propriedades do item, caso haja um ou mais itens na coleo. Exibir uma mensagem como "No h unidades de fita instaladas neste computador.", caso a coleo no contenha itens. 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).

Se houver um perodo de tempo relativamente longo entre colees de dados, aconselhvel executar o script como uma tarefa agendada. Dessa forma, voc pode agendar o script para ser executado todas as manhs, s 2:00, e nunca mais se preocupar com o assunto. Porm, usar tarefas agendadas no sempre uma opo. Por exemplo, digamos que voc deseje medir o uso do processador em um computador. Alm disso, voc deseja medir esse uso a cada 10 segundos at coletar 500 amostras. Embora, teoricamente, voc possa criar 500 tarefas agendadas, uma aps 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 vrias vezes incluir esses comandos em um loop For. Com um loop For, possvel executar um conjunto de comandos um determinado nmero de vezes. Por exemplo, o script mostrado na listagem 9 verifica de hora em hora por 12 horas o espao livre em disco em um computador. Para isso, uma instruo 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 espao 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 instruo Next, que marca o final do loop. Quando o script for executado, uma conexo ser estabelecida com o computador remoto atl-dc-01. O script recuperar e exibir as informaes de espao livre em disco e, em seguida, far uma interrupo de uma hora. Aps o trmino dessa interrupo, o script executar um loop e recuperar as informaes sobre espao livre em disco uma segunda vez. Esse processo continuar at que as informaes de espao em disco tenham sido recuperadas 12 vezes. Em seguida, o script executar a linha de cdigo aps a instruo Next. Como no h linhas de cdigo aps essa instruo, o script ser finalizado. Listagem 9 Executando comandos vrias 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 A instruo For permite executar um bloco de cdigo um determinado nmero de vezes. Ela no deve ser confundida com a instruo For Each. A instruo For Each usada para iterar os itens individuais em uma coleo (ou em uma matriz). A instruo For usada para executar um conjunto especfico de instrues um determinado nmero de vezes. Para usar a instruo For, necessrio determinar um ponto inicial e um ponto final. Como instrues For normalmente so criadas para executar um conjunto de instrues X vezes, voc iniciar com 1 e terminar com X. Portanto, para executar a mesma ao dez vezes, inicie com 1 e termine com 10. Observao Voc pode escolher um ponto inicial arbitrrio (por exemplo, 314 ou 6.912) e concluir com o ponto final apropriado (324 ou 6.922). Porm, ser mais fcil ler e manter seu cdigo se voc iniciar com 1 e terminar com 10. A instruo For exige que voc use uma varivel de loop (tambm chamada de contador) que mantm um clculo contnuo informando quantas vezes o loop foi executado. Por exemplo, a varivel i usada como o contador no cdigo a seguir. O contador iniciar em 1 e executar as linhas de cdigo contidas no corpo da instruo For. Aps as instrues terem sido executadas, o contador aumentar automaticamente em 1, significando que i agora igual a 2. O script retornar automaticamente ao incio da instruo For e verificar se o valor 2 ainda est no intervalo vlido. Como ele est, o corpo da instruo For ser executado uma segunda vez. For i = 1 To 5 Wscript.Echo i Next Wscript.Echo "Loop For concludo."

O que acontecer se i for igual a 6? O script retornar automaticamente ao incio do loop For e verificar se 6 faz parte do intervalo vlido. Como no faz, o loop For ser imediatamente finalizado e a execuo do script continuar na primeira linha aps a instruo Next. A sada do script ter a seguinte aparncia: 1 2 3 4 5 Loop For concludo. Observao Haver vezes em que voc desejar executar o mesmo conjunto de instrues continuamente; porm, no ser possvel determinar antecipadamente quantas vezes ser necessrio executar o cdigo. Por exemplo, digamos que voc deseje verificar o espao livre em disco uma vez por hora e que deseje continuar executando essa verificao at que o espao em disco fique abaixo do espao especificado. Nesse caso, voc deseja que o script inicie e continue a ser executado at que o espao em disco fique abaixo do limite, independentemente da quantidade de iteraes necessria para executar essa ao. Em situaes como essa, aconselhvel usar um loop Do (discutido no livro). Tomando decises Um dos principais motivos para a utilizao de scripts como ferramentas de administrao de sistema o fato de que eles reduzem a necessidade de interveno humana. Os scripts introduzidos at o momento neste captulo tentam atingir esse objetivo; a verso do script mostrado na listagem 8, por exemplo, pode conectar-se a qualquer computador (mesmo remoto), conectar-se WMI e determinar o espao livre em disco de cada unidade lgica instalada no computador. Executando esse script regularmente, os administradores podero receber uma notificao antecipada caso alguma unidade esteja com pouco espao em disco. Porm, ainda tarefa do administrador do sistema analisar a sada do script e determinar se um disco est ou no com pouco espao. O script pode ser aprimorado atravs do exame de espao e da emisso de uma notificao somente quando o espao livre est abaixo do nvel especificado. Com essa abordagem, os administradores s sero notificados se um disco estiver com pouco espao. Se no

houver notificaes, porque todos os discos esto em conformidade com os padres e nenhuma ao ser necessria. O VBScript fornece vrias construes de programao que permitem aos scripts "tomarem decises". Isso significa que um script pode analisar alguns dados e, em seguida, executar uma ao especificada com base no valor dos dados. A forma mais simples do cdigo de tomada de deciso a instruo If. Com a instruo If, o script examina o valor de um dado especfico, comparando-o a um limite pr-determinado (por exemplo, se o espao livre em disco menor do que 100 megabytes). Se a instruo for verdadeira (que seria o caso se somente 99 megabytes de espao em disco estivessem disponveis), o script executar uma ao. Se a instruo no for verdadeira, nenhuma ao ser executada. Esse tipo simples de tomada de deciso mostrado na listagem 10. Na linha 11, o script verifica se o espao livre menor do que 100 megabytes (isso feito atravs da comparao entre o valor e a constante WARNING_THRESHOLD). Se essa instruo condicional for verdadeira (por exemplo, se uma unidade tiver somente 99 megabytes de espao livre), a instruo imediatamente aps a construo If ser executada. Neste exemplo, a instruo seguinte a linha 12, que exibe a mensagem de que a unidade tem pouco espao em disco. Se a instruo condicional for falsa (por exemplo, se a unidade tiver 101 megabytes de espao livre em disco), a linha 12 no ser executada. Em vez disso, o processamento ser transferido para a linha 13, que marca o final da instruo If, e continuar na linha 14. Listagem 10 Tomando decises 1 Const CONVERSION_FACTOR = 1048576 2 Const WARNING_THRESHOLD = 100 3 Computer = "atl-dc-01" 4 5 Set objWmiService = GetObject("winmgmts://" & Computer) 6 Set colLogicalDisks = objWmiService.InstancesOf("Win32_LogicalDisk") 7 8 For Each objLogicalDisk In colLogicalDisks 9 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 10 FreeMegaBytes = Int(FreeMegaBytes) 11 If FreeMegaBytes < WARNING_THRESHOLD Then 12 WScript.Echo objLogicalDisk.DeviceID & " tem pouco espao em disco."

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)

6 Set colLogicalDisks = objWmiService.InstancesOf("Win32_LogicalDisk") 7 8 For Each objLogicalDisk In colLogicalDisks 9 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 10 FreeMegaBytes = Int(FreeMegaBytes) 11 If FreeMegaBytes < WARNING_THRESHOLD Then 12 WScript.Echo objLogicalDisk.DeviceID & " tem pouco espao em disco." 13 Else 14 WScript.Echo objLogicalDisk.DeviceID & " tem espao em disco adequado." 15 End If 16 Next possvel construir cenrios mais elaborados, cenrios que possam executar mais do que apenas duas aes possveis. Formas diferentes de construir esses cenrios so discutidas no System Administration Scripting Guide. Matrizes Colees so uma forma excelente de empacotar informaes, pois permitem trabalhar com vrios itens, mesmo que voc no conhea os detalhes sobre esses itens. Por exemplo, o script introduzido na listagem 8 permite recuperar o espao livre em disco de todas as unidades instaladas em um computador, mesmo que voc no saiba quantas unidades esto instaladas no computador. Para executar uma ao em cada item da coleo, simplesmente use um loop For Each para iterar em toda a coleo e execute a ao em todos os itens, um por um. Objetos de automao podem criar colees automaticamente. Porm, pode haver outras informaes, no retornadas por um objeto de automao, que sero mais fceis de manipular se voc puder iterar no conjunto de itens um por um. Por exemplo, digamos que voc deseje verificar o espao livre em disco disponvel em trs computadores e no apenas em um. Voc pode escrever o cdigo para verificar o primeiro computador, copiar e colar esse cdigo e, em seguida, modificar o cdigo colado para verificar o espao livre em disco no segundo computador. possvel repetir esse processo para verificar o espao livre em disco no terceiro computador. Embora essa abordagem funcione, ela logo se tornar tediosa, especialmente se voc precisar verificar, por exemplo, 100 computadores. Alm disso, digamos que voc precise alterar o cdigo, talvez retornando no apenas o espao livre na unidade, mas tambm o tamanho total da unidade. Para fazer essa alterao, seria necessrio

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 1 2 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:

Falta de flexibilidade. O script da listagem 12 recuperar somente informaes sobre o espao em disco disponvel nos computadores atl-dc-01, atl-dc-02 e atl-dc-03. Se voc precisar recuperar espao livre em disco para o computador atl-dc-04, ser necessrio modificar o script.

Atualizaes freqentes. O script da listagem 12 foi criado para recuperar informaes sobre o espao livre em disco de um conjunto especfico de computadores (por exemplo, todos os controladores de domnio em uma localizao especfica). Sempre que um novo controlador de domnio for adicionado ou sempre que um controlador de domnio existente for retirado, o script precisar ser atualizado. Se voc usar somente esse script em sua empresa, isso talvez no cause problemas. Porm, se usar vrios scripts, voc provavelmente perder mais tempo modificando-os do que economizar usando-os.

H vrias formas de se permitir que os usurios insiram informaes, como nomes de servidor, em um script (para obter mais detalhes sobre vrios desses mtodos, consulte o System Administration Scripting Guide). Talvez a maneira mais fcil seja fazer com que os usurios especifiquem essas informaes como argumentos sempre que o script for executado. Um argumento (tambm conhecido como parmetro) a informao fornecida junto com o comando que de fato executa o script. Por exemplo, digamos que voc normalmente inicie um script da seguinte maneira: cscript DiskSpace.vbs Um argumento qualquer informao extra adicionada ao final do comando. Por exemplo, esse comando possui trs argumentos, um para cada nome de computador: cscript DiskSpace.vbs atl-dc-01 atl-dc-02 atl-dc-03 Alm de fornecer argumentos, o script deve incluir o cdigo que usa esses argumentos. Esse tipo de cdigo abordado em detalhes no captulo 3 do System Administration Scripting Guide. Um exemplo simples tambm mostrado na listagem 13. Na linha 9 desse script, um loop For Each estabelecido para percorrer o conjunto de argumentos fornecido na inicializao do script. Nesse script, cada argumento atribudo sucessivamente varivel Computer e, em seguida, usado para estabelecer conexo com o servio WMI no computador (linha 11). Com base na linha de comando de exemplo acima, na primeira vez que o loop For Each for executado, o valor atl-dc01ser atribudo a Computer. Em iteraes subseqentes, os valores atl-dc-02 e atldc-03 sero atribudos a Computer.

Listagem 13 Obtendo entrada de usurio 1 Const CONVERSION_FACTOR = 1048576 2 Const WARNING_THRESHOLD = 100 3 4If WScript.Arguments.Count = 0 Then 5 WScript.Echo "Uso: DiskSpace.vbs servidor1 [servidor2] [servidor3] ..." 6 WScript.Quit 7 End If 8 9 For Each Computer In WScript.Arguments 10 11 Set objWmiService = GetObject("winmgmts://" & Computer) 12 Set colLogicalDisks = objWmiService.InstancesOf("Win32_LogicalDisk") 13 14 For Each objLogicalDisk In colLogicalDisks 15 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 16 FreeMegaBytes = Int(FreeMegaBytes) 17 If FreeMegaBytes < WARNING_THRESHOLD Then 18 WScript.Echo Computer & " " & objLogicalDisk.DeviceID & _ 19 " tem pouco espao em disco." 20 End If 21 Next 22 23Next Uma vantagem em usar argumentos o fato de que eles so colocados automaticamente em uma coleo (Wscript.Arguments). Isso torna mais fcil percorrer os argumentos fornecidos a um script: voc simplesmente configura um loop For Each e itera cada argumento da coleo, exatamente da mesma forma como itera as unidades de disco individuais em uma coleo de unidades de disco. Como argumentos so colocados em uma coleo, tambm fcil verificar quantos argumentos, se houver, foram fornecidos quando o script foi iniciado. Na linha 4 do script, Wscript.Arguments.Count usado para determinar a quantidade de argumentos fornecida (o nmero de argumentos fornecido ser igual ao nmero de itens da coleo de argumentos). Se a contagem for igual a 0, significando que nenhum argumento foi fornecido, um conjunto de instrues de utilizao ser exibido e o script ser finalizado (com o mtodo Wscript.Quit).

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 Description Descrio Descrio do erro. A descrio pode ser usada para informar ao usurio que ocorreu erro. Isso pode ser realizado com o eco do valor: Wscript.Echo Err.Description Number Nmero inteiro que identifica de forma exclusiva o erro ocorrido. Esse nmero pode representar um nmero de erro intrnseco do

VBScript ou um nmero de erro derivado de um objeto de automao (nmeros de erro do objeto de automao so conhecidos como SCODE, abreviatura para cdigo de status). Para determinar a origem do nmero de erro, use a propriedade Source. Source Nome da classe ou identificador programtico (ProgID) do objeto que causou o erro. Normalmente, quando o VBScript responsvel pelo erro, a mensagem "Microsoft VBScript runtime error" exibida como a origem. Se um objeto de automao for responsvel pelo erro, voc ver o ProgID (por exemplo, "Word.Application"). Quando um script iniciado, o valor padro 0 (sem erros) atribudo propriedade Number. Caso um erro seja encontrado, o valor da propriedade Number alterado. Isso permite a voc verificar periodicamente se o script encontrou erros. Por exemplo, talvez voc deseje verificar o status de erro aps tentar se conectar a um computador remoto. Se Err.Number for igual a 0, nenhum erro ter ocorrido. Se Err.Number no for igual a zero, ter ocorrido algum tipo de erro e voc poder supor que a tentativa de conexo com o computador remoto falhou. Como resultado, o script executar uma ao com base no fato de que o computador remoto no estava disponvel. Esse tipo de tratamento de erro implementado no script mostrado na listagem 14. Na linha 1 do script, o tratamento de erros ativado com a instruo On Error Resume Next do VBScript. Na linha 11, o script usa um loop For Each para percorrer uma lista de nomes de servidor. Na linha 12, o script tenta se conectar a cada um desses servidores. Mas o que ocorre se um desses servidores no est acessvel? Conforme observado, na linha 12 o script tenta se conectar a um desses servidores remotos. Se a conexo for bem-sucedida, nenhum erro ser gerado, significando que Err.Number permanecer igual a 0. Porm, se a conexo falhar, um erro ser gerado e Err.Number ser alterado para refletir o nmero atribudo ao erro. Se a tentativa de conexo na linha 12 falhar, On Error Resume Next garantir que o script tente executar a linha 13. Na linha 13, o script verifica o valor de Err.Number. Se o valor for diferente de 0 (significando que um erro ocorreu), o script exibir Err.Description e, em seguida, reiniciar o loop com o prximo nome de servidor. Se o valor for 0, isso significa que a conexo foi bem-sucedida. Em seguida, o script recupera o espao livre em disco do computador remoto.

Listagem 14 Tratamento de erros 1 On Error Resume Next 2 3 Const CONVERSION_FACTOR = 1048576 4 Const WARNING_THRESHOLD = 100 5 6 If WScript.Arguments.Count = 0 Then 7 WScript.Echo "Uso: DiskSpace.vbs servidor1 [servidor2] [servidor3] ..." 8 WScript.Quit 9 End If 10 11 For Each Computer In WScript.Arguments 12 Set objWmiService = GetObject("winmgmts://" & Computer) 13 If Err.Number <> 0 Then 14 WScript.Echo Computer & " " & Err.Description 15 Err.Clear 16 Else 17 Set colLogicalDisks = _ 18 objWmiService.InstancesOf("Win32_LogicalDisk") 19 For Each objLogicalDisk In colLogicalDisks 20 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 21 FreeMegaBytes = Int(FreeMegaBytes) 22 If FreeMegaBytes < WARNING_THRESHOLD Then 23 WScript.Echo Computer & " " & objLogicalDisk.DeviceID & _ 24 " tem pouco espao em disco." 25 End If 26 Next 27 End If 28 Next Se voc executar o script da listagem 14 e um dos servidores no estiver on-line, o objeto Err e suas propriedades sero preenchidos como mostrado na tabela 5. Tabela 5 Propriedade Err.Description Err.Number Valor The remote server machine does not exist or is unavailable 462

Err.Source Limpando erros

Microsoft VBScript runtime error

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

quaisquer garantias, explcitas ou implcitas, neste documento. As informaes contidas neste documento, incluindo o URL e outras referncias ao site da Internet na Web, esto sujeitas a alteraes sem aviso prvio. O usurio assume inteiro risco quanto ao uso e aos resultados do uso deste documento. Salvo indicao em contrrio, os exemplos de empresas, organizaes, produtos, pessoas e acontecimentos aqui mencionados so fictcios. Nenhuma associao com qualquer empresa, organizao, produto, pessoa ou acontecimento real intencional ou deve ser inferida. Obedecer a todas as leis de direitos autorais aplicveis responsabilidade do usurio. Sem limitar os direitos autorais, nenhuma parte deste documento pode ser reproduzida, armazenada ou introduzida em um sistema de recuperao, ou transmitida de qualquer forma por qualquer meio (eletrnico, mecnico, fotocpia, gravao ou qualquer outro), ou para qualquer propsito, sem a permisso expressa, por escrito, da Microsoft Corporation. A Microsoft pode ter patentes ou requisies para obteno de patente, marcas comerciais, direitos autorais ou outros direitos de propriedade intelectual que abrangem o contedo deste documento. A posse deste documento no lhe confere nenhum direito sobre as citadas patentes, marcas comerciais, direitos autorais ou outros direitos de propriedade intelectual, salvo aqueles expressamente mencionados em um contrato de licena, por escrito, da Microsoft. Trabalho no publicado. 2002 Microsoft Corporation. Todos os direitos reservados.

You might also like