Articles

SAPIEN Technologies (Italiano)

Dopo molti anni di scrittura di script per la console di Windows PowerShell, ora sto imparando il prossimo livello di automazione — scrittura di applicazioni GUI che eseguono i comandi di Windows PowerShell. I moduli di PowerShell Studio forniscono un’introduzione delicata e ben guidata alle applicazioni GUI, ma mi ci è voluto ancora un po ‘ di tempo per rompere le vecchie abitudini.

Ho costantemente bisogno di ricordare a me stesso che le cose che “funzionano” nella console non hanno alcun senso in una GUI. L’output di scrittura è uno di questi.,

Scrittura dell’output nella console

Quando si genera l’output nella console di Windows PowerShell, l’output viene visualizzato come stringhe di testo nella finestra della console.

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

Dietro le quinte, Windows PowerShell aggiunge silenziosamente un comando Out-String alla pipeline e invia i risultati a “standard output” (“stdout”). Il processo che ospita Windows PowerShell gestisce lo standard output, quasi sempre scrivendo l’output sulla console (il comportamento dell’host potrebbe variare).,

Quindi, se si esegue un cmdlet che restituisce oggetti, come il cmdlet Get-Process, (rappresentazioni stringa di) gli oggetti vengono visualizzati nella console.

Se si formattano gli oggetti, ad esempio utilizzando Format-List o Format-Table, gli oggetti formattati vengono visualizzati nella console.

Se si esegue Write-Host o Write-Output, Out-Host o Out-String, le stringhe di output vengono visualizzate nella console.

E anche se si invia l’output a un flusso di output alternativo utilizzando Write-Warning, Write-Verbose o Write-Error, per impostazione predefinita, l’output viene visualizzato nella console.,

Ma l’applicazione GUI non ha una console. Cosa succede all’output che altrimenti andrebbe alla console quando non c’è una console? E, ancora più importante, come posso gestire l’output senza una console?

Dove si trova il mio output?

Le applicazioni GUI, come quelle fantastiche che scrivi in PowerShell Studio, non hanno una console. Non esiste uno standard output. Non esiste una stringa di uscita automatica.

Così, quando si genera l’output e non salvarlo in un file o una variabile, l’output è appena perso.,

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

È come un lanciatore che lancia una palla da baseball quando non c’è nessun catcher sul campo. La palla cade a terra e si ferma .. ignorare.

Quindi, in un’applicazione GUI, non puoi semplicemente scrivere l’output e sperare per il meglio. Se si desidera visualizzare l’output cmdlet o salvarlo, è necessario farlo esplicitamente.

Visualizza l’output in una casella di testo

Un’applicazione GUI è una raccolta di controlli. Per visualizzare l’output, è necessario assegnare l’output a un controllo, ad esempio casella di testo, casella rich text o griglia dati.,

Ad esempio, per visualizzare il nome del computer locale nella console, si esegue un comando Comput env:ComputerName.

PS C:> $env:ComputerNameJUNEB-TESTBOX

Quando provo la stessa cosa in un’applicazione GUI in cui non c’è console, non vedo alcun risultato. In questo esempio, ho creato un modulo con un pulsante che, quando si fa clic, esegue l’espressione Comput env:ComputerName.,

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

Ma, quando clicco il pulsante non succede nulla, anche se ho una finestra di console aperta.

Per visualizzare il nome del computer in un’applicazione GUI, aggiungo un controllo display al mio modulo e assegno l’output del comando a un metodo del controllo display.,

Ad esempio, posso aggiungere un controllo Textbox al modulo e utilizzare l’operatore di assegnazione (=) per assegnare il risultato dell’espressione alla proprietà Text della TextBox. Ora, quando fai clic sul pulsante, vedi l’output nella casella di testo.

 butt buttonComputerName_Click = {text textboxResults.Testo = $env:ComputerName}

Ecco il risultato:

Visualizza l’Output in un Programma Diverso

È anche possibile visualizzare l’output di comandi in oggetti che non fanno parte del programma., I professionisti della GUI pensano che questo approccio sia sciatto e non una best practice, ma potresti trovarlo utile per il test o il debug.

Ad esempio, è possibile convogliare l’output nel cmdlet Out-GridView.

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

Ecco il risultato:

Si può anche scrivere in un file e aprire il file. Questi comandi di esempio creano un file temporaneo, scrivono nel file e quindi utilizzano il blocco note per visualizzare il file., Ancora una volta, questo fa rabbrividire i veri programmatori, ma funziona, almeno per i test.

Ecco il risultato:

Converti in stringhe

Un’altra attività che devi gestire in un’applicazione GUI è la conversione di oggetti in stringhe di testo. Di solito, questo significa solo convogliare l’output su un cmdlet Out, come Out-String. I cmdlet Out, incluso Out-GridView, convertono gli oggetti in dati stringa.

Quando si scrive l’output sulla console, Windows PowerShell aggiunge automaticamente un comando Out-String alla pipeline., Ma non esiste una console e nessuna stringa di uscita automatica in un’applicazione GUI.

Quando si assegnano oggetti non string a un oggetto string o a un controllo che accetta oggetti string, ad esempio una casella di testo, Windows PowerShell chiama il metodo toString() dell’oggetto. (In altre lingue, l’assegnazione fallirebbe, ma sta cercando di aiutare.) Con alcuni oggetti, come gli oggetti DateTime e ErrorRecord, toString () funziona bene, ma, in molti casi, produce risultati dall’aspetto strano.

Ad esempio, questo comando assegna i risultati di un comando Get-Process a una casella di testo., Windows PowerShell riconosce che è necessario il testo e chiama il metodo toString () degli oggetti di processo, ma il risultato non è utile.

 butt buttonGetProcess_Click = {text textboxResults.Text=Get-Process}

Per ottenere una rappresentazione stringa della tabella di processo predefinita, immettere l’output nel cmdlet Out-String e quindi assegnarlo alla casella di testo.

 butt buttonGetProcess_Click = {text textboxResults.,Text=Get-Process | Out-String}

SUGGERIMENTO: per rendere l’output facile da leggere, imposta la casella di testo (o la casella rich text) per utilizzare un carattere a spaziatura fissa. In PowerShell Studio, fare clic con il pulsante destro del mouse sulla casella di testo, fare clic su Applica set di proprietà e quindi su Applica carattere console.

Non evitare completamente toString (). Ci sono alcuni oggetti in cui il metodo toString() produce un risultato utile. Gli oggetti DateTime sono l’esempio classico. Il metodo toString () di un oggetto DateTime restituisce una stringa di formato “short-date/long-time”. Out-String restituisce un formato “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

 #Utilizza toString () butt buttonGetDate_Click = {text textboxDate.Text=Get-Date}

#Utilizza toString () butt buttonGetDate_Click = {text textboxDate.Text=Get-Date | Out-String}

È inoltre possibile utilizzare i parametri Formato e UFormat del cmdlet Get-Date per ottenere una stringa di data formattata in quasi tutte le configurazioni., Ad esempio, per ottenere una data in formato RFC1123, utilizzare-Format R (o “r”). Non è necessario eseguire il pipe su Out-String quando si utilizza Format o UFormat, poiché questi parametri costringono il cmdlet a restituire una stringa.

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

Conversione di oggetti formattati

Nella console, i cmdlet di formato, come Format-Table, sono solitamente l’ultimo elemento di una pipeline. L’output sembra ottimo nella console, perché Windows PowerShell aggiunge un comando Out-String alla pipeline prima di inviarlo alla console.,

Ma, in un’applicazione GUI, per impostazione predefinita, si ottiene il risultato di chiamare il metodo toString() degli oggetti format restituiti dai cmdlet Format.

 butt buttonGetHotfix_Click = {text textboxHotFix.Text = Get-HotFix / Format-Table-Property HotFixID, InstalledOn-AutoSize}

Per ottenere una visualizzazione più utilizzabile nell’applicazione GUI, inserire gli oggetti format nel cmdlet Out-String prima di assegnarli alla proprietà Text della casella di testo.,

Che è meglio!

Dopo un po’, il compito di gestire la visualizzazione dell’output nelle applicazioni GUI diventa naturale come digitare un nome cmdlet, ma mentre stai imparando, assicurati di testare e assicurarti che tutto l’output sia catturato e visualizzato in un formato utilizzabile.

June Blender è un evangelista tecnologico presso SAPIEN Technologies, Inc. Puoi contattarla a [email protected] oppure seguila su Twitter all’indirizzo @ juneb_get_help.