You are on page 1of 10
Set abjwmiService = GetObject("winmamts:") Set colTapeDrives = objWmiService.InstancesOf("Win32_TapeDrive") Wscript.€cho colTapeDrives.Count seu script pode usar a propriedade Count para determinar 0 nlimero de itens da colegao e executar uma das seguintes opgGes: + Exibir as propriedades do item, caso haja um ou mais itens na colecdo. + Exibir uma mensagem como "Nao ha unidades de fita instaladas neste computador.", caso a calec3o no contenha itens. script poder ter esta aparéncia (0 uso da instrucdo If-Then-Else ser explicado posteriormente neste artigo) Set abjwmiService = GetObject("winmamts:") Set colTapeDrives = objWmiService.InstancesOf("Win32_TapeDrive") If colTapeDrives.Count = 0 Then Wscript.Echo "Nao hd unidades de fita instaladas neste computador." Else For Each objTapeDrive In colTapeDrives WScript.Echo objTapeDrive.Name Next End If Loop \Voeé ja viu uma forma de loop quando usou a instrugdo For Each do VBScript. Embora a instrugo For Each seja a forma ideal de iteragdo através de uma colecSo ou de uma matriz, outros cenarios podem garantir uma construg30 de loop mais flexivel. Por exemplo, scripts que monitoram ou medem recursos de sistema normalmente precisam coletar dados em intervalos periédicos. £ improvavel que vocé verifique o espaco livre em disco momentos apds instalar um novo disco rigido e depois nunca mais verifique 0 espaco livre ainda disponivel na unidade. Em vez disso, é provavel que vocé verifique o espago 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 esta sendo monitorado (por exemplo, servidores de correio normalmente usam espago em disco de maneira mais répida do que outras estacées de trabalho do usuario). Se houver um periado de tempo relativamente longo entre colecées de dados, 6 aconselhavel executar o script como uma tarefa agendada. Dessa forma, vocé pode agendar o script para ser executado todas as manhis, 4s 2:00, @ nunca mais se Preocupar com o assunto. Porém, usar tarefas agendadas no é sempre uma opsao. Por exemplo, digamos que vocé deseje medir o uso do processador em um computador. Além disso, vocé deseja medir esse uso a cada 10 segundos até coletar 500 amostras. Embora, teoricamente, vocé possa criar 500 tarefas agendadas, uma apés a outra, isso resulta em muito mais trabalho. Uma abordagem mais adequada é executar um Unico script que colete todas as 500 amostras. Uma maneira de fazer com que um Unico script execute 0 mesmo conjunto de comandos varias vezes é incluir esses comandos em um loop For. Com um loop For, & possivel executar um conjunto de comandos um determinado ntimero de vezes. Por exemplo, o script mostrado na listagem 9 verifica de hora em hora por 12 horas o espaco livre em disco em um computador. Para isso, uma instrucdo For é usada na linha 7 indicando que o loop deve ser executado 12 vezes. As linhas 8-14 representam © corpo do loop For e determinam o espace 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 instruggo Next, que marca o final do loop, Quando o script for executado, uma conexdo ser estabelecida com o computador remoto atl-de-01. O script recuperara e exibird as informagdes de espaco livre em disco e, em seguida, faré uma interrup¢ao de uma hora. Apés 0 término dessa interrupcao, o script executard um loop e recuperara as informagées sobre espago livre em disco uma segunda vez. Esse processo continuara até que as informacées de espaco em disco tenham sido recuperadas 12 vezes. Em sequida, o script executara a linha de cédigo apés a instrug3o Next. Como no ha linhas de cédigo apés essa instrugo, o script sera finalizadbo. Listagem 9 Executando comandos varias vezes 1 Const CONVERSION_FACTOR = 1048576 2 Const ONE_HOUR = 3600000 3 Computer = "atl-de-01" 4 5 Set objwmiService = GetObject("winmgmts://" & Computer) 6 7Fori= 1to 12 8 Set colLogicalDisk = objWmiService.InstancesOf{""Win32_LogicalDisk") 9 For Each objLogicalDisk In colLogicalDisk k.FreeSpace / CONVERSION_FACTOR 11 FreeMegaBytes = Int(FreeMegaB ytes) 12 WScript.Echo objLogicalDisk.DevicelD &"" & FreeMegaBytes 13 Next 14 Wscript.Sleep ONE_HOUR 15 Next 10 FreeMegaBytes = objLogicalDi For A instrugdo For permite executar um bloco de cédigo um determinado nimera de vezes, Ela no deve ser confundida com a instrucéo For Each. A instrucéio For Each & usada para iterar os itens individuais em uma coleg3o (ou em uma matriz). A instrugéo For é usada para executar um conjunto especifico de instrugdes um determinado numero de vezes, Para usar a instrugo For, é necessario determinar um ponto inicial e um ponto final. Como instrugées For normalmente so criadas para executar um conjunto de instrugdes X vezes, vocé iniciard com 1 e terminara com X. Portanto, para executar 2 mesma ago dez vezes, inicie com 1 e termine com 10. Observacio Vocé pode escolher um ponto inicial arbitrario (por exemplo, 314 ou 6.912) e concluir com o ponto final apropriado (324 ou 6.922). Porém, ser mais facil ler e manter seu cédigo se vocé iniciar com 1 e terminar com 10. A instrugo For exige que vocé use uma variavel de loop (também chamada de contador) que mantém um célculo continuo informando quantas vezes 0 loop foi executado, Por exemplo, a varidvel / 6 usada como o contador no cédigo a seguir. 0 contador iniciaré em 1 executard as linhas de cédigo contidas no corpo da instrugSo For. Apés as instrugdes terem sido executadas, o contador aumentara automaticamente em 1, significando que / 6 agora igual a 2. O script retornard automaticamente ao inicio da instrugdo For e verificard se o valor 2 ainda esté no intervalo valido. Como ele est, 0 corpo da instrugo For sera executado uma segunda vez, Fori=1T05 Wscript.Echo i Next Wscript.€cho "Loop For concluido.” (© que acontecer se for igual a 6? O script retornar automaticamente ao inicio do loop For e verificara se 6 faz parte do intervalo valido. Como no faz, 0 loop For sera imediatamente finalizado e a execucdo do script continuara na primeira linha apés a instruggo Next. A saida do script teré a seguinte aparéncia: 1 3 4 5 Loop For concluido. Observacao Haverd vezes em que vocé desejara executar o mesmo conjunto de instrugées continuamente; porém, ndo sera possivel determinar antecipadamente quantas vezes sera necessario executar 0 cédigo. Por exemplo, digamos que vacé deseje verificar o espago livre em disco uma vez por hora e que deseje continuar executando essa verificacdo até que o espaco em disco fique abaixo do espaco espacificado. Nesse caso, vocé deseja que o script inicie e continue a ser executado até que 0 espaco em disco fique abaixo do limite, independentemente da quantidade de iteragGes necessaria para executar essa acdo, Em situagdes como essa, é aconselhavel usar um loop Do (discutido no livro). Tomando decisées Um dos principais motivos para a utilizaco de scripts como ferramentas de administrago de sistema é 0 fato de que eles reduzem a necessidade de interven¢So humana. Os scripts introduzidos até o momento neste capitulo tentam atingir esse objetivo; a verséo do script mostrado na listagem 8, por exemplo, pode conectar-se a qualquer computador (mesmo remoto), conectar-se 4 WMI e determinar o espaco livre em disco de cada unidade Idgica instalada no computador. Executando esse script regularmente, os administradores poderdo receber uma notificagao antecipada caso alguma unidade esteja com pouco espaso em disco Porém, ainda é tarefa do administrador do sistema analisar a saida do script e determinar se um disco esta ou n3o com pouco espaco. O script pode ser aprimorado através do exame de espaco e da emiss3o de uma notificago somente quando 0 espaco livre esta abaixo do nivel especificado, Com essa abordagem, os administradores sé sero notificados se um disco estiver com pouco espaco. Se ndo houver notificagdes, 6 porque todos os discos esto em conformidade com os padres enenhuma aco serd necesséria, © vaScript fornece varias construgées de programacSo que permitem aos scripts “tomarem decisées". Isso significa que um script pode analisar alguns dados e, em seguida, executar uma aco especificada com base no valor dos dados. ‘A forma mais simples do cédigo de tomada de decisio é a instrucdo If. Com a instrugo If, 0 script examina o valor de um dado especifico, comparando-o a um limite pré-determinado (por exemplo, se 0 espaco livre em disco é menor do que 100 megabytes). Se a instrucdo for verdadeira (que seria 0 caso se somente 99 megabytes de espaco em disco estivessem disponiveis), 0 script executard uma ago. Se a instrugo nao for verdadeira, nenhuma aco sera executada Esse tipo simples de tomada de deciso é mostrado na listagem 10. Na linha 11, 0 script verifica se o espaco livre é menor do que 100 megabytes (isso é feito através da comparaco entre o valor e a constante WARNING_THRESHOLD). Se essa instrug3o condicional for verdadeira (por exemplo, se uma unidade tiver somente 99 megabytes de espaco livre), a instrucdo imediatamente apds a construsao If sera executada. Neste exemplo, a instrucdo seguinte é a linha 12, que exibe a mensagem de que a unidade tem pouco espaco em disco. Se a instruco condicional for falsa (por exemplo, se a unidade tiver 101 megabytes de espago livre em disco), a linha 12 nao sera executada. Em vez disso, o processamento sera transferido para a linha 13, que marca o final da instrucdo If, e continuara na linha 14. Listagem 10 Tomando decisées 1 Const CONVERSION_FACTOR = 1048576 2 Const WARNING_THRESHOLD = 100 3 Computer = "atl-de-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(FreeMegaB ytes) 11 If FreeMegaBytes < WARNING_THRESHOLD Then 12 WScript.Echo objLogicalDisk.DevicelD &" tem pouco espago em disco.” 13 EndIf 14 Next Executando varias acdes usando If-Then-Else O script mostrado na listagem 10 exibiré uma mensagem de aviso se uma unidade tiver pouco espaco em disco. Porém, se a unidade de disco tiver espago livre adequado, nenhuma mensagem sera exibida. Para um script simples de monitorac3o, isso é aceitavel. Por outro lado, o usuario que estivesse executando esse script, ndo teria como saber se a falta de saida havia ocorrido porque todas as unidades possuiam espago em disco adequado ou porque a execugao do script havia falhado por algum mativo. Em outras palavras, as vezes & necessério que o script avalie uma condicgo e, em seguida, execute uma aco diferente com base nessa avaliaco. Por exemplo, talvez vocé deseje exibir uma mensagem de aviso quando a unidade tiver pouco espaco em disco e@ uma mensagem "Sem problemas" quando a unidade tiver espago em disco adequado. Esse tipo de abordagem pode ser implementado com a instruc&o If-Then- Else. ‘A funcao da instrugo If-Then-Else estd implicita em seu nome. Se (If) uma codigo for verdadeira (ou falsa), execute esta acdo. Caso contrdrio (Else), execute esta aco, Se houver pouco espago em disco, ecoe uma mensagem de aviso. Caso contrario, ecoe a mensagem "Sem problemas" Um exemplo disso é mostrado na listagem 11. Na linha 11, 0 espaco livre em disco de uma unidade 6 comparado a um limite de aviso. Se a instrugo condicional for verdadeira (isto é, se o espago livre em disco for menor do que o limite de aviso), a linha 12 sera executada. E se a instrugao condicional for falsa? Para lidar com essa possibilidade, uma cléusula Else foi incluida na linha 13. Se a instrugo condicional for falsa © a unidade tiver espaco adequado, a linha 14, linha imediatamente apés a clausula Else, sera executada. Listagem 11 Usando uma instrucao If-Then-Else 1 Const CONVERSION_FACTOR = 1048576 2 Const WARNING_THRESHOLD = 100 3 Computer = "atl-de-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(FreeMegaB ytes) 11 If FreeMegaBytes < WARNING_THRESHOLD Then 12 WScript.Echo objLogicalDisk.DevicelD &" tem pouco espago em disco.” 13 Else 14 WScript.Echo objLogicalDisk.DevicelD &" tem espaco em disco adequado." 15 End If 16 Next E possivel construir cenarios mais elaborados, cenarios que possam executar mais do que apenas duas ages possiveis. Formas diferentes de construir esses cenarios so discutidas no System Administration Scripting Guide Matrizes Colegdes so uma forma excelente de empacotar informacées, pois permitem trabalhar com varios itens, mesmo que vocé no conheca os detalhes sobre esses itens. Por exemplo, o script introduzido na listagem 8 permite recuperar 0 espaco livre em disco de todas as unidades instaladas em um computador, mesmo que vocé nao saiba quantas unidades esto instaladas no computador. Para executar uma aco em cada item da colecdo, simplesmente use um loop For Each para iterar em toda a colecdo & execute a acdo em todos os itens, um por um. Objetos de automacdo podem criar colecées automaticamente. Porém, pode haver outras informagées, no retornadas por um objeto de automagao, que sero mais faceis de manipular se vocé puder iterar no conjunto de itens um por um. Por exemplo, digamos que vocé deseje verificar 0 espaco livre em disco disponivel em tras computadores endo apenas em um. Vacé pode escrever 0 cédigo para verificar o primeiro computador, copiar e colar esse cédigo e, em seguida, modificar o cédigo colado para verificar o espaco livre em disco no segundo computador. E possivel repetir esse proceso para verificar 0 espaco livre em disco no terceiro computador. Embora essa abordagem funcione, ela logo se tornara tediosa, especialmente se vocé precisar verificar, por exemplo, 100 computadores. Além disso, digamos que vocé precise alterar 0 cédigo, talvez retornando no apenas 0 espaco livre na unidade, mas também o tamanho total da unidade. Para fazer essa alteragao, seria necessario alterar todas as 100 instancias, 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 espaco livre em disco de cada um. Para fazer isso, deve- se colocar os names dos computadores em uma matriz, uma estrutura de dados que pode ser usada praticamente da mesma forma que uma colego. O script mostrado na listagem 12 coloca os nomes de trés computadores (atl-de-01, atl-de-02 e atl-de-03) em uma matriz e usa um loop For Each para conectar-se a cada computador recuperar as informagdes de espaco livre em disco. Na linha 3, uma matriz chamada Computers é criada. Isso é feito com a fungdo Array, através da espacificacdo dos nomes dos trés computadores como os pardmetros da funcdo (os nomes so colocados entre aspas, pois so sequéncias de caracteres). Na linha 5, um loop For Each usado para percorrer todos os elementos da matriz Computers. Listagem 12 Usando matrizes 1 Const CONVERSION_FACTOR = 1048576 2 Const WARNING_THRESHOLD = 100 3 Computers = Array("atl-dc-01", "atl-de-02 4 ‘at!-de-03") 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(FreeMegaB ytes) 13 If FreeMegaBytes < WARNING_THRESHOLD Then 14 WScript.Echo Computer & """ & objLogicalDisk.DevicelD & _ 15" tem pouco espaco em disco." 16 End If 17 Next 18 19 Next Embora matrizes possam parecer similares a colegGes, pelo menos no contexto da instrugo For Each, existe uma diferenca importante. Uma matriz 6 uma lista de valores simples e indexada e uma colec3o ¢ um objeto de automacdo, 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 colego (linha 8) da mesma forma como faria com qualquer objeto de automacdo. As matrizes no possuem esses requisitos, pois No so abjetos de automacao. Um numero de indice é atribuido a cada elemento de uma matriz. No VBScript, 0 numero de indice 0 atribuido ao primeiro elemento de uma matriz e os nimeros 1, 2, 3 etc, so atribuidos aos elementos subsequientes. Logo, a matriz criada no script anterior conteria os nimeros de indice e os elementos mostrados na tabela 3. Observe que o numero de indice mais alto serd sempre uma unidade menor do que o numero de elementos da matriz. Tabela 3 Numero de indiceElemento 0 atl-de-01 1 atl-de-02 2 atl-de-03 \Vocé pode usar esses ntimeros de indice para acessar elementos individuais na matriz. Por exemplo, essa linha de cédigo exibira atl-de-02, 0 valor do ntimero de indice 1 eo segundo elemento da matriz: Wscript.Echo Computers( 1) Para exibir o valor de um item diferente na matriz, substitua o valor 1 pelo numero de Indice apropriado. Métodos 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 ndo espera alteragGes na infra-estrutura de computaco, ja que essa infra-estrutura ja esta estabelecida, Uma infra-estrutura estatica como essa é a excegdo e ndo aregra. A maioria das empresas possui um ambiente mais dindmico; embora somente trés servidores (atl-dc-01, atl-de-02, atl-de-03) precisem de monitoracdo no momento, ndo ha garantias de que somente esses trés servidores precisardo de monitoragao posteriormente. Itens embutidos em cédigo, coma nomes de computador nos scripts, ocasionam dois problemas relacionados: + Falta de flexibilidade. 0 script da listagem 12 recuperara somente informagées sobre o espaco em disco disponivel nos computadores atl-de-O1, at!-de-02 e atl-de-03. Se vocé precisar recuperar espaco livre em disco para 0 computador atl-de-04, sera necessario modificar o script. + Atualizacées freqiientes. O script da listagem 12 foi criado para recuperar informagées sobre o espaco livre em disco de um conjunto especifico de computadores (por exemplo, todos os controladores de dominio em uma localizag&o especifica). Sempre que um novo controlador de dominio for adicionado ou sempre que um controlador de dominio existente for retirado, o script precisara ser atualizado. Se vocé usar somente esse script em sua empresa, isso talvez no cause problemas. Porém, se usar varios scripts, voc® provavelmente perderd mais tempo modificando-os do que economizaré usando-os. Ha varias formas de se permitir que os usuérios insiram informacées, como nomes de servidor, em um script (para abter mais detalhes sobre varios desses métodos, consulte 0 System Administration Scripting Guide). Talvez a maneira mais facil seja fazer com que os usuérios especifiquem essas informacées como argumentos sempre que o script for executado. Um argumento (também conhecido como pardmetro) & a informagSo fornecida junto com © comando que de fato executa o script. Por exemplo, digamos que vocé normalmente inicie um script da seguinte maneira: script DiskSpace.vbs Um argumento é qualquer informacao extra adicionada ao final do comando. Por exemplo, esse comando possui trés argumentos, um para cada nome de computador: script DiskSpace.vbs atl-dc-O1 atl-dc-02 ati-de-03 ‘Além de fornecer argumentos, o script deve incluir 0 cédigo que usa esses argumentos. Esse tipo de cddigo ¢ abordado em detalhes no capitulo 3 do System Administration Scripting Guide. Um exemplo simples também é mostrado na listagem 13. Na linha 9 desse script, um loop For Each estabelecido para percorrer 0 conjunto de argumentos fornecido na inicializacdo do script. Nesse script, cada argumento & atribuido sucessivamente a variavel Computer e, em seguida, usado para estabelecer conexo com o servico 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-de- O1sera atribuido a Computer. Em iteragdes subseqlientes, os valores atl-dc-02 e atl- dc-03 sero atribuidos a Computer.

You might also like