Posso sempre passar uma array para o parametro –ComputerName ?


Um amigo me fez uma pergunta bem interessante esta semana . Ele leu em algum lugar que voce pode passar uma array de computadores para qualquer cmdlet que tenha o parametro computername. A sua pergunta foi se é assim mesmo que funciona.

A resposta é NÃO (ou ..depende. Eu adoro dizer isso…me faz sentir como um verdadeiro DBA hahahahah)

É verdade que a maioria dos cmdlets que tem o parametro –computername aceitam uma array com os nomes dos computadores, mas não todos eles. O que realmente conta não é quem esta chamando o cmdlet e sim o tipo de dados do parametro (no caso computername) no proprio cmdlet.

Vamos dar uma olhadinha no Get-Process :

Eu posso passar uma lista de coomputadores no parametro -computername

Get-Process –computername Yoda

ou

Get-Process –computername Yoda, R2D2, C3PO

ou

$MyServers = ‘Yoda’, ‘R2D2’, ‘C3PO’

Get-Process –computername  $MyServers

Ou mesmo uma lista num arquivo texto :

$Myservers = get-content c:\temp\myservers.txt
Get-Process –computername  $MyServers

ou

Get-Process –computername (get-content c:\temp\myservers.txt)

MAS o que faz este procedimento possível é que o parametro –computername no Get-Process ACEITA uma array de strings. Como eu sei disso ?

Simples, somente use o cmdlet Get-Help e verifique se o parametro em questão tem o abre fecha colchetes [] na frente do tipo de dados .Isso caracteriza uma array em PowerShell e consequentemente que aceita uma array como parametro.

Se olharmos o Get-Process:

 image

Nos veremos isso.

MAS todos os cmdlets que tem o parametro –computername aceitam uma array ? NÃO..pra exemplificar minha afirmação, vamos rodar este script que procura pelo parametro –computername em todos os cmdlets e retorna seu tipo de dados :

 

   1: Get-Command -CommandType Cmdlet -ParameterName ComPutername | % {

   2:     $CmdletName = $_.name

   3:     $CmdletParameters = ((Get-Command $CmdletName -ErrorAction SilentlyContinue).ParameterSets).Parameters |

   4:     Where-Object { $_.Name -eq 'ComputerName'} |

   5:     Select -First 1 ParameterType, Name

   6:     #Posh 3.0 and 2.0

   7:     New-Object Psobject -Property @{    CmdletName = $CmdletName;

   8:                                         CmdletParameterName = $CmdletParameters.Name

   9:                                         CmdletParameterType = $CmdletParameters.ParameterType

  10:                                     }

  11:  

  12:  

  13:     #Posh 3.0 Only

  14:     #[pscustomobject]@{CmdletName = $CmdletName;CmdletParameterName = $CmdletParameters.Name;CmdletParameterType = $CmdletParameters.ParameterType    }                             

  15:  

  16: }

E o retorno é :

image

Como podemos ver NEM TODOS OS PARAMETROS COMPUTERNAME ACEITAM ARRAY. Se você tentar, vai dar pau. Vamos ver com o cmdlet Write-EventLog

   1: New-EventLog  -Source 'TestComputerName' -LogName 'Application' -ComputerName yoda

   2: Write-EventLog -EntryType 'Error'   -LogName 'Application'  -Message 'TestComputerName' -Source 'TestComputerName'  -EventId 500 -ComputerName yoda,c3po,R2d2

and :

1

 

Ha Laerte, mas como eu faço neste caso ?

Você pode continuar usando uma array, simplesmente terá que criar um foreach e passar cada elemento da array :

$MyServers = ‘Yoda’, ‘R2D2’
$MyServers |
Foreach {
    mycmdlet -computername $_
}

ou

$MyServers = ‘Yoda’, ‘R2D2’
forerach ($Servers in $MyServers) {

    mycmdlet -computername $Servers
}

*Muito mais performatico que usar o foreach cmdlet (Primeiro)
Veremos isso mais a fundo nos videos que estou preparando

 

Conclusão

Sempre..Sempre verifique os parametros e aprenda sobre o cmdlet antes de usa-lo, com get-help, get-member..etc. Não somente por esta razão do post, mas por outras milhares. Outra é você estar deixando sua estrutura lenta usando o pipeline e where-object para filtrar alguma coisa e existir um parametro no cmdlet que ja faz este filtro para você. Pipeline é bom e core para aprender PowerShell, mas não é performatico 🙂

About Laerte Junior

Laerte Junior Laerte Junior is a SQL Server specialist and an active member of WW SQL Server and the Windows PowerShell community. He also is a huge Star Wars fan (yes, he has the Darth Vader´s Helmet with the voice changer). He has a passion for DC comics and living the simple life. "May The Force be with all of us"
This entry was posted in Algo que Esqueci de Categorizar. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s