You are on page 1of 10
talvez seja necessario um script maior, especialmente um script usado na configuracdo de empresas. Nessas situagées, literais podem resultar em, pelo menos, dois problemas! + Confusao. Em um script pequeno, pade estar evidente que 1048576 é o valor necessario para converter bytes (o valor retornado da propriedade FreeSpace) em megabytes. Em um script maior, que inclua varias equagées matemticas, isso pode no estar to evidente, Esse problema ocorre principalmente em configuragées de empresas, onde varios administradores podem usar -- e modificar -- 0 mesmo script. Embora seja facil 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 sera alterado, talvez no seja relevante que o uso de literais possa ser confuso. Porém, se houver possibilidade de alterac3o no script, os valores literais no sé sero confusos, como também exigirdo 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é tera de modificar corretamente cada linha de cédigo em que ocorrer a conversao. Se nao fizer isso, o script no fornecerd resultados precisos. Uma maneira de evitar os problemas que podem surgir devido ao uso de literais utilizar constantes. Constantes so similares a varidveis, pois ambas so locais para armazenar dados. Porém, ao contrario das variaveis, as constantes, depois que so definidas (isto 6, depois que um valor é atribuido a elas), no podem ser modificadas durante a execugdo do script. Ao atribuir itens importantes, como o valor necessario para converter bytes em megabytes, a uma constante, vocé pode garantir que o valor permanecer o mesmo: um valor de constante ndo pode ser alterado, nem inadvertidamente nem de qualquer outra forma, Na listagem 5, uma constante chamada CONVERSION_FACTOR é definida na linha 1 e 0 valor 1048576 é atribuido a ela. Posteriormente no script (linha 4), 0 numero de bytes de espace livre em disco é convertido no numero de megabytes de espago livre em disco. Em vez de usar o valor literal 1048576, a constante CONVERSION_FACTOR 6 utilizada, Ambas as equacGes retornam o mesmo resultado; porém, é mais facil ler e compreender a equacdo da listagem 5. Listagem 5 Usando constantes 1 Const CONVERSION_FACTOR = 1048576 2 Set objwmiService = GetObject("winmgmts:") 3 Set abjLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DevicelD='C: 4 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 5 FreeMegaB ytes = Int(FreeMegaB ytes) 6 WScript.cho FreeMegaB ytes Outro beneficio da utilizacdo de constantes é que elas podem ser definidas uma vez e usadas varias vezes no mesmo script. Por exemplo, uma versdo expandida do script mostrado na listagem 5 pode exigir que vocé converta bytes em megabytes varias, vezes durante a execucao do script. Em vez de usar o valor literal em cada equacSo, use a constante, Se mais tarde vocé decidir converter bytes em gigabytes, precisara somente alterar 0 valor da constant; ngo seré necessério alterar o valor usado em cada equacao. Seqiiéncias de caracteres ‘A medida que vocé escreve scripts cada vez mais sofisticados, comesa a encontrar tipos diferentes de dados (esse tépico é abordado em mais detalhes no livro). Na listagem 5, por exemplo, vocé precisou usar dados numéricos para atribuir o valor literal 1048576 a constante CONVERSION_FACTOR: Const CONVERSION_FACTOR = 1048576 Essa linha de cédigo seré executada corretamente, pois um valor numérico estd sendo atribuido a constante. Sempre que vocé atribuir um valor numérico a uma variavel ou a.uma constante, digite o sinal de igual seguido do valor. No entanto, resultados inesperados podero ocorrer se vocé tentar atribuir um valor alfanumérico (geralmente chamado de valor de sequéncia de caracteres) usando a mesma abordagem. Por exemplo, 0 cédigo a seguir tenta atribuir a sequiéncia de caracteres atl-de-01 4 variavel Computer e, em seguida, exibir o valor da variavel: Computer = atl-de-01 Wscript.fcho Computer Quando esse script for executado, o valor mostrado na figura 4 sera exibido. Figura 4 Como 0 valor -1 foi atribuido & variével Computer? Quando o VBScript encontra um conjunto de caracteres alfanuméricos que nao est entre aspas duplas, ele pressupée que os caracteres representam o nome de uma variavel. Se ele vir um hifen "perdido", presumird que representa um sinal de menos. Como resultado, ele interpretara a linha Computer = atl-de-01 como a variavel Computer seré atribuido: +O valor da variavel atl + Menos 0 valor da variavel de + Menos 0 valor 01 Como at! e de so exibidas como novas varidveis que no foram inicializadas, 0 valor 0 sera atribuido a elas. Dessa forma, o VBScript interpretard essa linha de cédigo como se estivesse escrita assim Computer = 0-0-1 Por isso a atribuicdo errénea de -1. Quando vocé atribui um valor de seqUiéncia de caracteres a uma variavel ou a uma constante, deve colocd-lo entre aspas duplas; essa é a Unica forma de assegurar que o \VeScript tratard a seqliéncia de caracteres como um valor alfanumérico @ no como uma variavel. Por exemplo, esse cédigo atribui corretamente a seqtiéncia de caracteres ati-de-01 4 varidvel Computer e, em seguida, exibe os resultados: Computer = “atl-de-01" Wscript.fcho Computer Quando esse script for executado, a sequiéncia de caracteres mostrada na figura 5 serd exibida, Figura 5 Seqiiéncias de caracteres como variaveis Frequentemente, as seqliéncias de caracteres sdo usadas para atribuir valores a varidveis. Por exemplo, os scripts usados até agora neste capitulo empregam o seguinte cédigo para conectarem-se 4 WMI Set abjwmiService = GetObject("winmamts:") Sem explicar todos os detalhes da conexdo com a WMI (para obter essas informasées, consulte o capitulo sobre a WMI no livro), esse cédigo sempre conacta vocé a0 computador local. Isso é suficiente, a menos que vacé seja um administrador de sistema responsdvel pelo gerenciamento de alguns computadores remotos. Nesse caso, 6 aconselhavel usar um script que possa recuperar o espaco livre em disco de um computador remoto. Isso permitiré a vocé verificar, a partir da sua estagao de trabalho, 0 espaco em disco disponivel em qualquer computador sob o seu controle. Com a WMI, é possivel conectar-se a um computador remoto simplesmente incluindo 0 nome do computador como parte do identificador de origem GetObject. Por exemplo, esta linha de cédigo conecta vocé ao servico WMI no computador remoto ati-de-01! Set objwmiService = GetObject("winmgmts: //atl-dc-01") \Vocé pode usar 0 cédigo precedente para escrever um script que faca a conexdo com 0 computador remoto, Porém, em uma configuracao de empresa, talvez voc deseje um script mais flexivel que possa conectar-se a qualquer computador remato. Para isso, edite o script sempre que executa-lo, substituindo o nome embutido em cédigo do computador pelo nome embutide em cédigo 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 usuario sera discutida posteriormente neste artigo. No entanto, antes de comear essa discuss, ¢ importante compreender como os valores de seqiiéncia de caracteres (como nomes de computador) podem ser atribuidos a uma variavel e, em seguida, utilizados como parte do cédigo de script. Por exemplo, na linha 2 da listagem 6, o valor da sequiéncia de caracteres atl-dc-01 é atribuido 4 variével Computer. Na linha 3, essa varidvel é usada para fazer a conexdo com 0 servico WMI no computador at!-dc-01. Porém, isso nao é feito embutindo-se em cédigo 0 valor atl-dc-01 no identificador de registro, mas sim através do valor da variavel Computer. Listagem 6 Usando seqiiéncias de caracteres 1 Const CONVERSION_FACTOR = 1048576 2 Computer = "atl-de-01" 3 Set objwmiService = GetObject("\winmgmts://" & Computer) 4 Set objLogicalDisk = objWmiService.Get("Win32_LogicalDisk.DevicelD='C: 5 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 6 FreeMegaB ytes = Int(FreeMegaB ytes) 7 WScript.Echo FreeMegaB ytes Em um pequeno script de demonstracao como esse, usar uma varidvel para o nome do computador provavelmente exige mais esforgo do que embutir o valor em cédigo. Porém, esse script ilustra um conceito importante: vocé pode atribuir um valor a uma varivel e usé-la no lugar de um valor embutido em cédigo. Por que isso é importante? Imagine que esse script foi criado para recuperar espaco livre em disco de 100 computadores. Em vez de embutir em cédigo sequancias de caracteres separadas do identificador de registro da WMI em cada computador, ¢ possivel criar uma unica seqtiéncia de caracteres com a variavel Computer. Em seguida, o script podera executar essa Unica seqliéncia de caracteres 100 vezes, a cada vez substituindo o valor de Computer por um nome de computador diferente. Porém, no momento, vocé sé precisa se concentrar na linha 3: Set objwmiService = GetObject("winmgmts://"" & Computer) E desta forma que o VBScript interpreta essa linha de cédigo: 1. © VBscript Ié tudo até a segunda aspa dupla. Em outras palavras: Set objwmiService = GetObject("winmgmts://" is Ele 18 0 E comercial, que significa basicamente "acrescentar 0 préximo item & segliéncia de caracteres precedente”. 0 que vem depois do E comercial é a varidvel Computer, 8 qual foi atribuida o valor atl-de-01. 0 VBScript vé a linha da seguinte forma: Set objwmiService = GetObject(""winmgmts: //atl-de-0: 3. Ele 18 o caractere de paréntese de fechamento. O VBScript exige que vocé tenha um numero igual de parénteses de abertura e de fechamento. Se o paréntese de fechamento nao estiver incluido, vocé receberé uma mensagem. de erro. Agora, 0 VBScript Ié a linha de cédigo como Set objwmiService = GetObject("winmgmts: //atl-de-0: 4. Apés chegar ao final da linha, o VBScript executa a instrugo. Por sua vez, 0 script se conecta ao servico WMI em atl-dc-01. Para conectar-se ao servico WMI em um computador diferente, vocé sd precisa alterar o valor da variavel Computer: Concatenando seqiiéncias de caracteres Concatenaco refere-se ao proceso de combinar duas ou mais sequiéncias de caracteres em uma Unica seqiéncia de caracteres (também ¢ possivel combina-las com valores numéricos ou de datas). A concatenagdo ¢ usada com frequéncia para fornecer saida mais significativa e legivel. Por exemplo, o script mostrado na listagem 4 retorna um valor como 10340. Essa informacdo é bastante util, desde que vocé tenha certeza de que o script foi desenvolvido para retornar o numero de megabytes de espaco livre em disco da unidade C. Caso vacé no conhega a funco do script, a saida sera sem sentido. Entre outras fungdes, a concatenag3o ajuda a fornecer contexto para sua saida de script. Por exemplo, em vez de exibir 0 valor 10340, é aconselhdvel exibir uma mensagem similar a "Hd 10340 megabytes de espaco livre em disco”. Para fazer isso, vocé pode combinar os trés itens a seguir: + "Ha", uma sequéncia de caracteres simples representando o inicio da mensagem + FreeMegaBytes, a varidvel contendo o numero de megabytes livres na unidade. +" megabytes de espaco livre em disco. representando o final da mensagem. ", uma segunda seqiiéncia de caracteres Conforme mostrado nas linhas 3, 7 2 8 da listagem 7, vocé concatena itens no VBScript usando 0 E comercial (&) Listagem 7 Concatenando seqiiéncias de caracteres 1 Const CONVERSION_FACTOR = 1048576 2 Computer = “atl-de-01" 3 Set objwmiService = GetObject("\winmgmts://" & Computer) 4 Set objLogicalDisk = objwmiService.Get("Win32_LogicalDisk.DevicelD='C: 5 FreeMegaBytes = objLogicalDisk.FreeSpace / CONVERSION_FACTOR 6 FreeMegaB ytes = Int(FreeMegaB ytes) 7 WScript.Echo "Ha " & FreeMegaBytes & __ 8" megabytes de espaco livre em disco." Observacao O sublinhado (_) no final da linha 7 6 conhecido como o caractere de continuacao de linha e é usado para indicar uma quebra na instrugao. Isso significa que as linhas 7 e 8 devem ser tratadas como uma Unica linha. Por ser muito grande para caber no espaco reservads, a linha foi quebrada. As quebras de instrugo so abordadas em mais detalhes no livro. Como alternativa, vocé pode ter atribuido o valor "Ha" a uma variavel chamada MessageStart e a sequiéncia de caracteres " megabytes de espaco livre em disco." a uma variével chamada MessageEnd. Em seguida, vocé pode ter concatenado as trés varidveis da seguinte maneira Wscript.Echo MessageStart & FreeMegaBytes & MessageEnd Se vocé observar as linhas 7 e 8, perceberd que os espacos em branco foram embutidos em cédigo nos valores da seqliéncia de caracteres "HA" ©" megabytes de espaco livre em disco.". Isso é necessério, pois o£ comercial n3o insere espacos entre 98 itens sendo concatenados. Por exemplo, exclua os espagos em branco, desta forma: WScript.Echo "Ha" & FreeMegaBytes & "megabytes de espaco livre em disco.” Nesse caso, a mensagem resultante executara os trés valores juntos, conforme mostrado na figura 6. ura 6 Para formas simples de concatenacdo, vocé pode evitar esse problema usando uma virgula em vez do E comercial para combinar os valores: WScriptEcho "Ha", FreeMegaBytes, "megabytes de espaso livre em disco.” Quando itens so separados por virgula, um espago em branco ¢ inserido automaticamente entre eles. Como resultado, a mensagem ¢ formatada de maneira apropriada, conforme mostrado na figura 7. Figura 7 Colecées ‘Até este ponto do artigo, os scripts foram criados para recuperar o espago livre na unidade C de um computador especificado, Determinar o espago livre em uma Unica unidade ¢ uma tarefa administrativa comum, especialmente quando vocé esta trabalhando com estagdes de trabalho de usudrios que possuem somente uma unidade, Como a inten¢do era recuperar apenas 0 espaso livre em disco da unidade C, © DevicelD foi embutido em cédigo no script. E claro que, provavelmente, outros computadores -- incluindo a maioria dos servidores -- possuem varias unidades. Para esses computadores, a determinago do espaco livre na unidade C no é informacdo suficiente; como administrador do sistema, vocé também precisa conhecer o espaco livre da unidade D, da unidade € e das outras unidades instaladas no computador. (Na verdade, a classe Win32_LogicalDisk pode identificar e retornar as propriedades de todos os tipos de unidade, incluindo disquetes, CD-ROMs e unidades de rede mapeadas.) Porém, isso apresenta um problema imediato: como saber quais unidades esto instaladas em um determinado computador? Teoricamente, vocé pode verificar 0 espaco livre das unidades C a Z, mas, se um computador no possuir, por exemplo, uma unidade €, o script falhara. Embora seja possivel incluir um cédigo criado para tratar esses erros e impedir que o script falhe, o script resultante seria muito longo, dificultando a sua leitura e a sua manutengo. Esse script especifico também seria muito ineficiente; mesmo que um computador tivesse somente uma unidade, o script tentaria recuperar 0 espaco livre nas unidades D a Z inexistentes. Felizmente, objetos de automacdo quase sempre retornam informagées na forma de colegdes. Como colesies de selos ou de moedas, essas colegdes de automagao so simples grupos de itens relacionados. Por exemplo, o script da listagem 8 usa 0 método InstancesOf da WMI (linha 4) para retornar no apenas uma unidade especifica, mas uma colecdo consistindo em todos os discos légicos instalados no computador. Se 0 computador tiver quatro unidades (C, D, E F), a colecdo tera quatro itens, um para cada unidade. Listagem 8 Usando colecées 1 Const CONVERSION_FACTOR = 1048576 2 Computer = "atl-de-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 FreeMegaB ytes = Int(FreeMegaB ytes) 8 WScript.Echo objLogicalDisk.DevicelD &"" & FreeMegaBytes 9 Next Obter inform agdes retornadas como uma colecdo significa que vocé ndo precisa antecipar quais unidades esto instaladas ou nao em um computador. Em vez disso, simplesmente pergunte pela colec3o (todas as instdncias de unidades de disco instaladas no computador). Depois que a colecao tiver sido retornada, vocé poderd usar um loop For Each (também conhecido como um loop de iteragao) para examinar cada item individual da coleg3o. For Each A instrugdo For Each fornece uma maneira simples de iterar todos os itens em uma coleco (ou em uma matriz). Ao contrario da instrucdo For (que ser abordada posteriormente), For Each no exige que vocé saiba quantos itens existem na colecdo, Em vez disso, ela inicia com o primeiro item da colegSo (ou matriz) e continua até que tenha efetuado um loop em cada item Um loop For Each tipico tem a seguinte aparéncia: For Each abjLogicalDisk In colLogicalDisks WScriptEcho objLogicalDisk.DevicelD Next Os itens individuais que compéem esse loop sao descritos na tabela 2. Tabela 2 Item objLogicalDisk colLogicalDisks For Each objLogicalDisk in colLogicalDisks Wscript.Echo objLogicalDisk.DevicelD Descr \Varidvel que representa as instdncias de unidade de disco individuais. Nome dado a colec&o de unidades de disco recuperada com a WMI Inicia 0 loop. A sintaxe basica pode ser lida como Instancia For Each de um objeto em uma colec3o de objetos executa uma ac3o. Neste exemplo, isso pode ser lido como "Para cada unidade de disco individual na colecéio de unidades de disco instalada neste computador..." Instrucdes executadas para cada unidade de disco na coleco (neste exemplo, hd somente uma instrugdo, mas pode haver varias instrucdes entre as instrucdes For Each e Next) Observe que a referéncia a unidades de disco individuais ¢ feita com a variavel objLogicalDisk e com a propriedade adequada (neste caso, DevicelD). O valor dessa propriedade sera alterado todas as vezes através do loop. Por exemplo, em um computador com unidades C, D © €, abjLogicalDisk.DevicelD sera igual a C na primeira iteracdo, pois C 6 0 DevicelD da primeira unidade da colegio. Em passagens subseqtientes através do loop, objLogicalDisk.DevicelD serd igual a D 2, em seguida, ae. Next Indica o final do loop. Depois de iterar cada item da colecdo, o script prosseguird na linha apds a instrugSo Next. Se no houver linhas apds essa instrucdo, 0 script serd finalizado. Colecées sem itens E possivel que uma colecdo nao contenha itens. Por exemplo, considere este script, que retorna 0 conjunto de todas as unidades de fita instaladas em um computador: Set objwmiService = GetObject(""winmamts:") Set colfapeDrives = objWmiService.InstancesOf("Win32_TapeDrive") For Each objTapeDrive In colTapeDrives WScript.Echo objTapeDrive.Name Next Se esse script for executado em um computador sem unidades de fita, parecer que nada aconteceu. Na verdade, o script seré executado conforme o esperado. Porém, como 0 computador no possui uma unidade de fita, a coleso resultante de todas as unidades de fita instaladas no computador no conterd itens. Quando executado em um computador sem unidades de fita, o script ird Conectar-se ao servico WMI is Recuperar a caleco de unidades de fita instalada no computador. 3. Configurar um loop For Each para percorrer toda a coleco, exibindo o nome de cada unidade de fita individual da colec3o. Porém, como nao ha itens na colegao, 0 loop For Each e as instrucdes nele incluidas ndo sero de fato executados. Em vez disso, o loop For Each sera ignorado e o script ira para a primeira linha apés a instrugao Next. Nesse script de exemplo, nao ha linhas de cédigo apés a instrucdo Next, logo, o script é finalizado. Infelizmente, isso pode ser confuso: no existe maneira dbvia de saber se o script foi executado ou ngo. Uma forma de aprimorar esse script ¢ usar a propriedade Count para determinar a quantidade de itens na colegdo. Por exemplo, esse script usa a propriedade Count para exibir 0 nlimero de unidades de fita instaladas em um computador:

You might also like