Comparando PowerShell com VBS

De acordo com o ditado popular “o melhor caminho é aquele que você conhece”, eu também demorei a me aventurar em PowerShell (PSH), devido ao arsenal de scripts em VBS e C# que já tenho desenvolvido. Entretanto, aos poucos estou me rendendo a facilidade e ao poder do PowerShell, que para mim é uma mistura de VBS com C# usando a estrutura do bash.

Dando seqüência ao post que comparava PowerShell (PSH) com C# , neste post pretendo fazer uma comparação entre scripts em PSH com o Visual Basic Script (VBS) e o Windows Script Host (WSH) que são as linguagens mais consolidada entre os profissionais de infra-estrutura para a plataforma Windows.

Seguindo os mesmos moldes do artigo anterior, peguei um script desenvolvido em VBS e o portei para PSH. O script selecionado é utilizado em migração de Active Directory, mais especificamente na migração das estações.

Um arquivo texto contendo o nome das estações que serão migradas é entregue pela equipe de TI. O script então verifica quais estão ligadas por meio de WMI ping, e filtra quais já foram migradas anteriormente, extraindo o nome do domínio de cada uma delas. O resultado é um arquivo texto com as estações que podem migradas naquele momento.

Visual Basic Script

 

01. On Error Resume Next

02. strComputer = "."

03. Const ForReading = 1

04. Const ForAppending = 8

05. Set objFSO = CreateObject("Scripting.FileSystemObject")

06. Set InputFile = objFSO.OpenTextFile ("C:\temp\computers.txt", ForReading)

07. Set OutputOKtFile = objFSO.OpenTextFile ("C:\temp\pingOK.txt", ForAppending, True)

08. Set OutputNOTOKtFile = objFSO.OpenTextFile ("C:\temp\pingNOTOK.txt", ForAppending, True)

09.

10. Do Until InputFile.AtEndOfStream

11. strRead = InputFile.Readline

12. Set objWMIService = GetObject("winmgmts:\\" & strRead & "\root\cimv2")

13. Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address='" & strRead & "'")

14. For Each pingStatus in colPings

15. If IsNull(pingStatus.StatusCode) or pingStatus.StatusCode<>0 Then

16. OutputNOTOKtFile.WriteLine(strRead)

17. Else

18. Set objWMIComputer = GetObject( "winmgmts:\\" & strRead & "\root\cimv2" )

19. Set colComp = objWMIComputer.ExecQuery( "Select * from Win32_ComputerSystem")

20. For Each compStatus in colComp

21. OutputOKtFile.WriteLine(compStatus.name & " - " & compStatus.domain)

22. Next

23. End If

24. Next

25. Loop

 

PowerShell v2

 

01. $fInput=get-content "C:\temp\computers.txt"

02. foreach($strRead in $fInput)

03. {

04. $ALive=get-wmiobject -Query "select * from win32_pingstatus where Address='$strRead'" | Select-Object statuscode

05.

06. if($ALive.statuscode -eq 0)

07. {

08. Get-WmiObject -Class Win32_ComputerSystem -ComputerName $strRead | FT Name,Domain -A -HideTableHeaders| Out-File -Append -Force c:\temp\PingOK.txt     

09. }

10. else

11. {

12. $strRead| Out-File -Append -Force c:\temp\PingNOTOK.txt

13. }

14. }

 

As principais diferenças entre PSH e VBS são:

· No PSH não precisa inicializar e controlar os componentes WMI, AD, File System  entre outros, logo o código fica reduzido;

· A estrutura dos cmdlets Verbo-Substantivo (Verb-Noun), permite estruturas genéricas poderosas, como get-content que pode abrir arquivos, e extensões orientadas aos serviços, como Get-ADUser, da extensão do Active Directory;

· O PSH utiliza classes e métodos  .NET, enquanto no VBS o seu uso é limitado;

· O PSH requer .Net 2.0 e a sua própria instalação, o VBS é nativo na plataforma Windows;

· O PSH é suportando no Windows XP Service Pack 2, Windows Server 2003, Windows Vista, Windows 7 e Windows Server 2008, enquanto o VBS pode ser executado praticamente em todas os Sistemas Operacionais Windows;

· A quantidade de código desenvolvido em VBS é superior ao do PSH. Encontrar um exemplo pronto na Internet em VBS é (teoricamente) mais fácil.

Em médio/longo prazo eu vejo benefícios claros na adoção e migração de VBS para PSH. A Microsoft vem acrescentando novos recursos e investindo no PSH nos últimos anos. Todos os produtos recém-lançados suportam a nova linguagem para configuração. Por isso, pense duas vezes quando pensar que PSH não vale a pena. Experimente portar seus scripts, e em pouco tempo você vai se surpreender desenvolvendo em PSH.