Windows PowerShell: As diversas facetas de um objeto personalizado

Realmente não importa qual abordagem escolhida para produzir objetos personalizados, enquanto um objeto personalizado é seu resultado final.

Don Jones

Recentemente, eu escrevi um post de blog que descreve um conjunto de 12 práticas recomendadas para usar o Windows PowerShell. O No. 12 melhores práticas direciona gente para objetos de seus scripts e funções, em vez de saída de texto de saída. Eu fui tão longe como a sugerir que, se você já estava usando o cmdlet Write-Host, você deve voltar atrás e pensar sobre o que você estava fazendo. Todos os Write-Host faz é produzir texto.

Não muito tempo depois que esse post foi ao vivo, um leitor me contatou sobre o código que eu tinha usado realmente criar o objeto personalizado. Ele disse que ele nunca tinha visto essa abordagem antes. Que foi surpreendente, como o Windows PowerShell parece oferecer uma dúzia maneiras de fazer qualquer coisa. Ele sugeriu que eu escrever um artigo sobre as diferentes maneiras para produzir um objeto personalizado, então aqui estamos.

O caminho completo-forma

Esta é a maneira que a maioria das pessoas provavelmente escolheria para criar um objeto Personalizar. É o que eu chamo de "abordagem didático". Tem a vantagem de ser bastante claro, embora envolva um monte de digitação. Supondo que eu tenho um objeto na variável $SO e outra no bios $, eu poderia combinar peças seleccionadas de informações deles como este:

$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber $object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version $object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object

Você pode continuar esse padrão para adicionar quaisquer outras informações que você precisa para o objeto de saída final, antes de escrever para o pipeline.

-PassThru: Um breve atalho

Você pode fazer essa primeira abordagem um pouco mais concisa dizendo Add-Member para colocar o objeto de volta no pipeline:

$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object

Quando você finalizar uma linha com um caractere de pipe, Windows PowerShell sabe ir para a próxima linha física para olhar para o próximo comando no pipeline. Essencialmente, é uma forma de dividir um comando longo em várias linhas físicas. Esse truque, combinada com a opção –PassThru, isso faz uma série de três comandos distintos.

Hashtable um go-go

Enquanto as abordagens anteriores são eficazes, eles também são muito prolixos. Em um script, pode realmente ser duro para que você possa determinar visualmente o que está acontecendo. Usar o recurso de New-Object é uma abordagem mais concisa. Isso permite que você crie um hashtable (ou matriz associativa) que contém os nomes de propriedades e valores que você deseja adicionar o objeto recém-criado. Estas propriedades de cada um são criadas automaticamente como um NoteProperty:

$properties = @{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber} $object = New-Object –TypeNamePSObject –Prop $properties Write-Output $object

Isso tem o mesmo efeito, mas é muito mais conciso. Algumas pessoas inteligentes usará uma expressão entre parênteses para torná-lo ainda mais curto. No entanto, eu acho que isso torna um pouco mais difícil de ler:

$object = New-Object –TypeNamePSObject –Prop (@{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber}) Write-Output $object

Indo um pouco mais

Você vai notar que em todos estes exemplos, eu salvar o objeto personalizado para uma variável ($object) antes de escrever para o pipeline. A razão para isso é simple. Você pode querer manipular o objeto um pouco mais. Por exemplo, você pode querer dar um nome de tipo personalizado de seu objeto:

$object.PSObject.TypeNames.Insert(0,'My.Custom.Name')

Isso permite que você crie um layout para a exibição de seu objeto de formatação padrão personalizado. Eu usei esse truque com grande efeito no "scripts do Windows PowerShell e ferramentaria" (concentrado de tecnologia e treinamento técnico de Interface, 2011), um pequeno livro que eu escrevi que incide sobre coisas como o uso de objetos personalizados como saída de ferramentas personalizadas do Windows PowerShell.

Cursos diferentes para diferentes pessoas

Não há nenhuma maneira "errado" para fazer qualquer coisa no Windows PowerShell, enquanto sua abordagem começa o trabalho feito. Dito isto, há certas abordagens eu evitar, principalmente porque eles são menos legível e mais difícil de ensinar — especialmente para os recém-chegados. Aqui está um, assumindo ainda que meu sistema operacional de $ e $bios variáveis contêm os objetos crus de que eu quero extrair informações:

$os | Select-Object –Property @{n='OSVersion';e={$_.Version}}, @{n='OSBuild';e={$_.BuildNumber}}, @{n='BIOSSerial';e={$bios.SerialNumber}}

Você vai gerar os mesmos resultados que os exemplos anteriores, mas a sintaxe é terrível. Há uns lotes de pontuação, muita estrutura e você tem que entender muito sobre o Select-Object é fazendo com esses três hashtables.

Ele é basicamente gerar propriedades personalizadas usando uma sintaxe única para esse cmdlet (e compartilhada pelos cmdlets Format). Você verá essa sintaxe usada por pessoas com um plano de fundo do estilo de desenvolvimento de software. É mais difícil para mim (e muitos outros povos) mentalmente analisar, portanto, tendem a não usá-lo tanto.

PowerShell é nada se não flexível

O Windows PowerShell é único em que permite fugir com algumas coisas malucas. Por exemplo, volte para o meu exemplo de tabela de hash. Você também poderia fazê-lo desta forma:

$info = @{} $info.OSBuild=$os.BuildNumber $info.OSVersion=$os.version $info.BIOSSerial=$bios.SerialNumber $object = New-Object –TypeNamePSObject –Prop $info Write-Output $object

Você está criando um hashtable vazio e, em seguida, adicionando informações, referindo-se às propriedades que não existem. Quando você primeiro tenta acessar OSBuild, por exemplo, o Windows PowerShell percebe que esses bens não existe no objeto de info $ (que era um hashtable vazio). Ele implicitamente cria a propriedade e atribui seu valor. Coisas malucas — mas funciona.

Os estandes morais: Objetos, não texto

No entanto, optar por criar seus objetos personalizados, você pode criar objetos personalizados em vez da saída de texto simples para a janela de console. Objetos são infinitamente mais flexíveis, e eles permitem que sua saída de script ou função integrar com tudo o resto do Windows PowerShell.

Don Jones

Don Jonesé um Microsoft MVP Award destinatário e autor de "Aprender Windows PowerShell em um mês de almoços" (Manning Publications, 2011), um livro concebido para ajudar qualquer administrador se tornar eficaz com o Windows PowerShell. Jones também oferece treinamento de Windows PowerShell público e no local. Entre em contato com ele através de seu Web site em ConcentratedTech.com.

Conteúdo relacionado