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.