Ei, Equipe de Scripts!Cuidado com o que diz

A Equipe de Scripts da Microsoft

DURANTE A GUERRA Civil Americana (na Batalha de Spotsylvania, para ser preciso), o General da União John Sedgwick ficou consternado ao ver seus homens se agachando diante dos disparos ocasionais e aleatórios dados na direção deles pelos atiradores de elite dos Confederados. De acordo com a lenda, Sedgwick disse à tropa: “Vocês me envergonham, se esquivando desse jeito. Eles não acertariam nem um elefante nessa distância”. Instantes depois, Sedgwick se tornava o oficial da União de mais alta patente a morrer na guerra. Talvez os atiradores de elite dos Confederados não pudessem acertar um elefante naquela distância; porém, infelizmente para Sedgwick, eles conseguiram acertar um general.

Claro, mas falta dizer qual é a moral da estória. Bem, já que vocês perguntaram: “Mantenha sua cabeça abaixada quando alguém estiver atirando em você” seria uma bela moral, não seria? Ah, que pena! Nós não tínhamos pensado nisso. Na verdade, pensamos na seguinte moral: “Cuidado com o que diz, porque um dia isso pode se voltar contra você”. Bem, essa moral valeu para o General John Sedgwick e tem sido igualmente válida para muitas outras pessoas. Por exemplo, ninguém se lembra de Thomas Watson, chefe da IBM por um grande período, como um dos maiores empreendedores da história dos Estados Unidos. Em vez disso, Watson foi imortalizado como o homem que disse: “acho que existe um mercado mundial para, talvez, cinco computadores”.

O mais interessante é que não há evidência de que Watson tenha, realmente, dito isso; na melhor das hipóteses, pode ser que ele tenha, simplesmente, mencionado o pensamento de alguém a respeito do assunto. Mas quem se importa? Afinal, a idéia de que o chefe da IBM possa ter dito que não havia mercado para computadores rende uma estória tão boa que não podemos deixar que essas bobagens, que são os fatos, atrapalhem, não é?

Por eventualidade, Watson disse, realmente: “Se quiser ter sucesso, dobre sua taxa de fracassos”. Esse conselho a Equipe de Scripts abraçou de corpo e alma.

Bem, pelo menos a parte sobre dobrar a taxa de fracassos.

Existe, então, esta citação: “Se estiver escrevendo scripts em VBScript, você não terá acesso ao .NET Framework”. É verdade, dizer às pessoas que o Microsoft® .NET Framework é inacessível para autores de script não é tão memorável quanto dizer que “Eles não acertariam nem um elefante nessa distância” ou “Acho que existe um mercado mundial para, talvez, cinco computadores”. Todavia, tal afirmação é igualmente sem base. É verdade que o .NET Framework foi criado tendo em mente desenvolvedores de C# e Visual Basic® e, também, tendo em vista que o VBScript não pode criar instâncias de classes nativas do .NET Framework. Mas isso não quer dizer que o .NET Framework seja inacessível para autores de script, pelo menos não completamente.

Sim, vocês têm razão: nós não podemos negar que a maioria das classes do .NET Framework continua fora dos limites para o VBScript. No entanto, existe um número razoavelmente grande de classes .NET que possui invólucros CCW (COM-Callable Wrapper), o que significa, simplesmente, que essas classes contém uma interface COM que permite que as classes sejam acessadas por linguagens de script, como VBScript. Vocês estão dizendo que é difícil de acreditar? Então, examinem a parte HKEY_CLASSES_ROOT do registro exibida na Figura 1; vocês verão todos os tipos de classes que começam com System.

Figura 1 Classes do sistema no registro

Figura 1** Classes do sistema no registro **(Clique na imagem para aumentar a exibição)

A maior parte delas são classes .NET Framework e podem ter instâncias criadas por meio de VBScript.

Eu disse!

É óbvio, como qualquer pessoa que já comprou um produto anunciado em um programa da TV pode atestar, não é porque você pode fazer alguma coisa que você deve fazer (normalmente, há algum motivo pelo qual esses itens não são encontrados em lojas). Claro que é possível criar uma instância da classe System.ContextMarshalException em um script; mas nós não fazemos nenhuma idéia do motivo pelo qual você desejaria fazer isso.

Mas esse não é o caso de todas as classes de .NET Framework. Por exemplo, um dos grandes problemas do mundo do script é o fato de que não existe uma forma fácil de classificar uma lista de itens. Colocar uma lista em ordem alfabética exige que você use, por conta própria, um conjunto de registros desconectado ou crie uma função de classificação incompreensível, como o seguinte código de classificação bolha (talvez seja melhor que aqueles com estômago fraco passem diretamente para o próximo parágrafo):

For i = (UBound(arrNames) - 1) to 0 Step -1
    For j= 0 to i
        If UCase(arrNames(j)) > 
          UCase(arrNames(j+1)) Then
            strHolder = arrNames(j+1)
            arrNames(j+1) = arrNames(j)
            arrNames(j) = strHolder
        End If
    Next
Next

Não se aflija: fomos nós que escrevemos o código e também não estamos totalmente seguros do que ele significa.

Então, como o .NET Framework pode nos ajudar em uma situação como essa? Para responder essa pergunta, vamos observar um pequeno script muito simples e direto:

Set DataList = CreateObject _
      ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()

For Each strItem in DataList
    Wscript.Echo strItem
Next

Como vocês podem ver, o que estamos fazendo é criar uma instância da classe System.Collections.ArrayList do .NET Framework. Em seguida, usamos o método Add para adicionar cinco itens à lista. Tudo vai de vento em popa, exceto por uma coisa: nós adicionamos os itens de modo a esmo (B, C, E, D, A), mas é necessário que eles sejam exibidos em ordem alfabética (A, B, C, D, E). É hora de rebocar o código de classificação de bolha, certo?

Errado. (Desculpe por ser tão rude, mas errado é errado.) Da maneira que as coisas estão, não é necessário rebocar o código de classificação de bolha; tudo o que precisamos fazer é chamar o método Sort da lista de matrizes:

DataList.Sort()

É isso. Com essa única linha de código podemos classificar todos os itens de nossa lista de matrizes.

Querem tentar? Uau, que multidão valente. Tudo bem; nós esperávamos que houvesse um ou dois Thomas Desconfiados na platéia. É por isso que o script contém um loop For Each que passa por todos os itens da lista, ecoando o valor de cada um deles na tela:

For Each strItem in DataList
    Wscript.Echo strItem
Next

Agora, uma pergunta para vocês resolverem: o que obtemos quando executamos esse script?

Boa aposta:

A
B
C
D
E

Legal, não é?

Hum, parece que nem todos estão plenamente satisfeitos. Alguns estão dizendo que isso tudo está certo e direito, mas o que realmente queriam fazer era ecoar esses valores de volta em ordem decrescente; ou seja, queriam uma lista que fosse de Z a A, em vez de A a Z. Se vocês não conseguem fazer isso, tudo bem. . .

Ei, sem problemas. Tudo o que você tinha de fazer era perguntar:

Set DataList = CreateObject _
      ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()
DataList.Reverse()

For Each strItem in DataList
    Wscript.Echo strItem
Next

Você tem razão: isso parece muito com o script que acabamos de ver, não? Contudo, há um acréscimo importante. Observe a única linha de código que adicionamos, a linha que entra logo depois do método Sort:

DataList.Reverse()

Viu só? Após classificar a lista em ordem crescente, nós chamamos o método Reverse que – surpresa – inverte a ordem de todos os itens da matriz. O que isso nos oferece? Isso nos oferece uma saída parecida com:

E
D
C
B
A

É difícil não ficar impressionado, não é?

Mas espere! Pode ficar ainda melhor. Vocês já tentaram remover um item de uma matriz de VBScript? Calma, não precisa chorar; nós não vamos pedir que vocês façam isso. Em vez disso, vamos mostrar como é fácil remover um item de nossa lista de matrizes do .NET Framework. Não gosta da letra D? Livre-se dela. Eis um script que cria uma lista de matrizes, classifica-a e, em seguida, remove a entrada de D:

Set DataList = CreateObject _
  ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()
DataList.Remove("D")

For Each strItem in DataList
    Wscript.Echo strItem
Next

Examinemos, outra vez, a pequena linha de código imediatamente após o método Sort:

DataList.Remove("D")

Usamos, aqui, o método Remove para remover o item igual a D. E eis o que obtemos quando executamos o script:

A
B
C
E

Hasta la vista, D!

E não se esqueçam da melhor parte: conseguimos remover um item sem ter que redimensionar a matriz. Isso foi demais! É claro que também conseguimos adicionar itens à matriz sem ter que redimensionar os itens. Ousem dizer que isso não facilita a vida de vocês ao criar scripts.

Acreditem ou não, nós ainda nem abordamos o que é possível fazer com a lista de matrizes do .NET Framework (para obter mais informações, consulte aentrada da lista de matrizes no SDK do .NET Framework).

A lista de matrizes é útil para autores de script? Coloquemos as coisas desta forma: depois de ter visto a lista de matrizes do .NET Framework, nós não sabemos por que vocês iriam querer usar a matriz interna de VBSCript, pelo menos não para listas de itens simples como as que usamos aqui.

É verdade que nós, da Equipe de Scripts, não fizemos um levantamento exaustivo do .NET Framework para descobrir quais classes poderiam (e quais não poderiam) ser de utilidade para autores de script. Estamos trabalhando nisso. Nesse ínterim, sintam-se à vontade para bisbilhotar todo o SDK do .NET Framework (em inglês). Parece que toda vez que pesquisamos o SDK, encontramos algo novo e interessante que pode ser usado por autores de script.

Como o quê? Bem, gerar números aleatórios, por exemplo. Querem gerar um número aleatório entre 1 e 100 usando o gerador de números aleatórios do VBScript? Sem problemas; basta usar código similar a:

Randomize
Wscript.Echo Int((100 - 1 + 1) * Rnd + 1)

Memorizaram a fórmula? Não se preocupem, se não tiverem conseguido; acontece que é muito mais fácil e intuitivo usar a classe System.Random do .NET Framework:

Set objRandom = CreateObject("System.Random")
Wscript.Echo objRandom.Next_2(1,100)

É muito provável que vocês consigam imaginar isso sem precisar de explicação. Contudo, faremos um resumo, unicamente porque a TechNet Magazine tem essa idéia de que os colunistas devem escrever realmente sobre algo todo o mês. (Isso nos desconcerta... mas é a política deles, não a nossa.)

Como vocês podem ver, nós criamos uma instância da classe System.Random e, depois, chamamos o método Next_2, transmitindo-lhe dois parâmetros:

  • 1, o primeiro número de nosso intervalo (recorde-se de que esperamos gerar um número aleatório entre 1 e 100).
  • 100, o maior número de nosso intervalo.

Isso é tudo o que temos de fazer.

Parece que temos tempo para uma última pergunta. Sim, você mesmo, de camisa verde. Quem foi, exatamente, que disse que os autores de script não podiam acessar o .NET Framework? Bem, para ser bem honesto, bem no começo, nós... epa, parece que o tempo acabou, enfim. Vejo vocês no mês que vem!

Felicidades, Felicidades

Fevereiro está quase chegando, o que só pode significar algo... Não, não é o Carnaval. Não, nem o dia de Iemanjá. Ai, pelo amor de Deus, o Dia da Marmota?! Nada disso; quanto mais fevereiro se aproxima, mais perto chegamos dos Jogos de Script de Inverno de 2007, a primeira (e, provavelmente, a única) competição internacional de script do mundo. Este ano, os Jogos prometem ser maiores e melhores do que nunca; a partir de agora teremos quatro divisões:

  • VBScript para iniciantes
  • VBScript avançado
  • Windows PowerShell™ para iniciantes
  • Windows PowerShell™ avançado

Consulte a homepage dos Jogos de Script de Inverno de 2007 para obter mais informações.

O quê? Ah, obrigado. E, ah, um feliz Dia da Marmota para vocês também.

Faça hoje o donwload do Windows PowerShell™

O Windows PowerShell 1.0 já está disponível para download. E, inclusive, é grátis! Como é que você pode deixar passar um negócio desses? Faça o download do software (em inglês) e comece a usá-lo hoje.

A Equipe de Scripts da Microsoft trabalha para - bem, estão empregados por ela - a Microsoft. Quando não está jogando/treinando/assistindo beisebol (e diversas outras atividades), ela administra o TechNet Script Center. Confirme isso em www.scriptingguys.com (em inglês).

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..