Articles

SAPIEN Technologies (Português)

Depois de muitos anos escrevendo scripts para o console PowerShell do Windows, estou agora aprendendo o próximo nível de aplicações GUI de automação — escrita que executam comandos PowerShell do Windows. As formas de estúdio PowerShell fornecem uma introdução suave e bem guiada às aplicações GUI, mas ainda me levou algum tempo para quebrar velhos hábitos.

eu constantemente preciso me lembrar que as coisas que “apenas funcionam” no console não fazem qualquer sentido em uma interface gráfica. A saída de escrita é um deles.,

A gravar o resultado na consola

quando gerar o resultado na consola PowerShell do Windows, o resultado aparece como texto na janela da consola.

PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM

nos bastidores, o Windows PowerShell adiciona silenciosamente um comando para fora de linha ao gasoduto e envia os resultados para “standard output” (“stdout”). O processo que hospeda o Windows PowerShell lida com a saída padrão, quase sempre escrevendo a saída para o console (o comportamento do host pode variar).,

assim, se executar um cmdlet que devolve objectos, como o cmdlet do processo de obtenção, (representações de texto de) os objectos aparecem na consola.

Se você formatar objetos, como por exemplo usando Format-List ou Format-Table, (representações de texto de) os objetos formatados aparecem na consola.

Se executar a máquina de escrita ou a gravação-saída, A Máquina exterior ou o texto exterior, os textos de saída aparecem na consola.

E mesmo que envie o resultado para um fluxo de saída alternativo usando Write-Warning, Write-Verbose ou Write-Error, por omissão, o resultado aparece na consola.,

mas a aplicação GUI não tem uma consola. O que acontece com a saída que de outra forma iria para o console quando não há console? E, mais importante, Como faço para gerenciar a saída sem um console?

Onde está a minha saída?as aplicações GUI

, como as cool ones que você escreve em PowerShell Studio, não têm uma consola. Não há saída padrão. Não existe nenhuma linha externa auto-anexada.

assim, quando você gera saída e não a grava em um arquivo ou uma variável, a saída é apenas perdida.,

Get-Process | ... <Nowhere> ...

é como um arremessador lançando uma bola de beisebol quando não há apanhador no campo. A bola cai no chão e rola para uma paragem .. ignorar.

assim, numa aplicação GUI, você não pode simplesmente escrever a saída e esperar pelo melhor. Se você quiser mostrar o resultado do cmdlet ou gravá-lo, você precisa fazê-lo explicitamente.

mostrar o resultado num campo de texto

uma aplicação GUI é uma colecção de controlos. Para mostrar a saída, você precisa atribuir a saída a um controle, como caixa de texto, caixa de texto rica, ou uma grade de dados.,

Por exemplo, para mostrar o nome do computador local na consola, você executa um comando $env:ComputerName.

PS C:> $env:ComputerNameJUNEB-TESTBOX

quando tento a mesma coisa numa aplicação GUI onde não há consola, não vejo nenhum resultado. Neste exemplo, eu criei uma forma com um botão que, quando clicado, executa a expressão $env:ComputerName.,

$buttonComputerName_Click = { <b>$ $ $ $ env:ComputerName</b>}

Mas, quando eu clicar no botão, nada acontece, mesmo se eu tiver uma janela de console aberto.

para mostrar o nome do computador numa aplicação GUI, adiciono um controlo de visualização à minha forma e atribuo o resultado do comando a um método do controlo de visualização.,

Por exemplo, eu posso adicionar um controle de caixa de texto para o formulário e usar o operador de atribuição (=) para atribuir o resultado da expressão para a propriedade de texto da caixa de texto. Agora, quando você clica no botão, você vê a saída na caixa de texto.

$buttonComputerName_Click = { $textboxResults.Texto = $env:ComputerName}

Aqui está o resultado:

de Saída do vídeo em um Programa Diferente

Você também pode exibir a saída de comandos em objetos que não fazem parte do seu programa., Os profissionais da GUI pensam que esta abordagem é desleixada e não uma melhor prática, mas você pode achar útil para testar ou debugging.

Por exemplo, você pode encaminhar o resultado para o cmdlet Out-GridView.

$buttonComputerName_Click = { $env:ComputerName | Out-GridView}

Aqui está o resultado:

Você também pode escrever um ficheiro e abra o arquivo. Estes comandos de exemplo criam um arquivo temporário, escrevem para o arquivo, e então usam o bloco de notas para exibir o arquivo., Mais uma vez, isso faz com que programadores reais encham, mas funciona, pelo menos para testes.

aqui está o resultado:

Convert to Strings

outra tarefa que você precisa gerir numa aplicação GUI é converter objectos para strings de texto. Normalmente, isto significa apenas canalizar a sua saída para um cmdlet para fora, tal como O Out-String. Para fora cmdlets, incluindo Out-GridView, converter objetos para dados de texto.

quando escreve o resultado para a consola, o Windows PowerShell adiciona automaticamente um comando de saída de texto ao ‘pipeline’., Mas, não há console e nenhum Out-String automático em uma aplicação GUI.

Quando você atribui objetos não-string a um objeto de string ou a um controle que toma objetos de string, como uma caixa de texto, O Windows PowerShell chama o método toString() do objeto. (Noutras línguas, a tarefa falharia, mas está a tentar ajudar.) Com alguns objetos, como DateTime e objetos ErrorRecord, toString() funciona muito bem, mas, em muitos casos, produz resultados estranhos.

Por exemplo, este comando atribui os resultados de um comando Get-Process a um campo de texto., O Windows PowerShell reconhece que você precisa de texto e chama o método toString () de objetos de processo, mas o resultado não é útil.

$buttonGetProcess_Click = { $textboxResults.Text = Get-Process}

para obter uma representação de cadeia de caracteres da tabela de processo padrão, canalize a saída para o cmdlet de cadeia de saída e, em seguida, atribua-a ao campo de texto.

$buttonGetProcess_Click = { $textboxResults.,Text = Get-Process / Out-String}

TIP: Para tornar o resultado fácil de ler, defina o campo de texto (ou campo de texto rico) para usar um tipo de letra monoespacial. No PowerShell Studio, carregue com o botão direito no campo de Texto, Carregue em Aplicar o conjunto de Propriedades e, em seguida, carregue em Aplicar o tipo de letra da consola.

não evite toString () completamente. Existem alguns objetos onde o método toString() produz um resultado útil. Objetos DateTime são o exemplo clássico. O método toString () de um objeto DateTime retorna uma string de formato “curto-Data/longo-tempo”. O ‘Out-String’ devolve um formato de ‘long-date/long-time’.,

PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM

#Usa toString()$buttonGetDate_Click = { $textboxDate.Texto = Get-Date}

#Usa toString()$buttonGetDate_Click = { $textboxDate.Text = Get-Date | Out-String}

Você também pode usar o formato e os parâmetros UFormat do cmdlet Get-Date para obter uma string de data formatada em quase qualquer configuração., Por exemplo, para obter uma data no formato RFC1123, use-Format R (ou “r”). Não há necessidade de usar o ‘out-String’ quando você usa o formato ou UFormat, porque estes parâmetros forçam o cmdlet a retornar um string.

PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT

Converter objectos formatados

na consola, Formatar cmdlets, tais como Format-Table, são normalmente o último elemento num gasoduto. A saída fica ótima no console, porque o Windows PowerShell adiciona um comando Out-String para o pipeline antes de enviá-lo para o console.,

mas, em uma aplicação GUI, por padrão, você obtém o resultado de chamar o método toString () do formato objetos que o formato cmdlets retornam.

$buttonGetHotfix_Click = { $textboxHotFix.Texto = Get-Correcção | Format-Table-Property HotFixID, InstalledOn -AutoSize}

Para obter mais utilizável exibir em sua aplicação gráfica, de tubo o formato de objetos Fora de Seqüência de caracteres cmdlet antes de atribuir-lhes a propriedade de Texto da caixa de Texto.,

isso é melhor!

Depois de algum tempo, a tarefa de gerir a visualização do resultado nas suas aplicações GUI torna-se tão natural como escrever um nome cmdlet, mas enquanto estiver a aprender, certifique-se de testar e de que todo o seu resultado é capturado e apresentado num formato utilizável.June Blender é uma Evangelista tecnológica da SAPIEN Technologies, Inc. Você pode alcançá-la em [email protected] ou segui-la no Twitter no @juneb_get_help.