SAPIEN Technologies (Română)
după mulți ani de scris script-uri pentru consola Windows PowerShell, acum învăț următorul nivel de automatizare-scrierea aplicațiilor GUI care rulează comenzile Windows PowerShell. Formele PowerShell Studio oferă o introducere blândă și bine ghidată în aplicațiile GUI, dar mi-a luat încă ceva timp pentru a rupe obiceiurile vechi.
trebuie să-mi reamintesc constant că lucrurile care „funcționează doar” în consolă nu au niciun sens într-o GUI. Scrierea de ieșire este una dintre ele.,când generați ieșire în consola Windows PowerShell, ieșirea apare ca șiruri de text în fereastra consolei.
PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM
în spatele scenei, Windows PowerShell adaugă în tăcere o comandă Out-String la conductă și trimite rezultatele la „ieșire standard” („stdout”). Procesul care găzduiește Windows PowerShell gestionează ieșirea standard, aproape întotdeauna scriind ieșirea în consolă (comportamentul gazdei poate varia).,
deci, dacă executați un cmdlet care returnează obiecte, cum ar fi cmdletul Get-Process, (reprezentări string ale) obiectele apar în consolă.
dacă formatați obiecte, cum ar fi folosind Format-List sau Format-Table, (reprezentări string ale) obiectele formatate apar în consolă.
Dacă executați Write-Host sau Write-Output, Out-Host sau Out-String, șirurile de ieșire apar în consolă.
și chiar dacă trimiteți ieșirea într-un flux de ieșire alternativ utilizând Write-Warning, Write-Verbose sau Write-Error, în mod implicit, ieșirea apare în consolă.,
dar aplicația GUI nu are o consolă. Ce se întâmplă cu ieșirea care altfel ar merge la consolă atunci când nu există consolă? Și, mai important, cum pot gestiona ieșirea fără o consolă?
unde este ieșirea mea?
aplicațiile GUI, precum cele cool pe care le scrieți în PowerShell Studio, nu au o consolă. Nu există o ieșire standard. Nu există nici o auto-anexat Out-String.deci, atunci când generați ieșire și nu o salvați într-un fișier sau într-o variabilă, ieșirea este doar pierdută.,
Get-Process | ... <Nowhere> ...
este ca un aruncător care aruncă o minge de baseball atunci când nu există niciun captator pe teren. Mingea doar cade la pământ și role la o oprire .. ignorat.
deci, într-o aplicație GUI, nu puteți doar să scrieți ieșire și să sperați la cele mai bune. Dacă doriți să afișați ieșirea cmdlet sau să o salvați, trebuie să o faceți în mod explicit.
afișare ieșire într-o casetă de text
o aplicație GUI este o colecție de controale. Pentru a afișa ieșirea, trebuie să atribuiți ieșirea unui control, cum ar fi caseta de text, caseta de text îmbogățit sau o grilă de date.,
de exemplu, pentru a afișa numele computerului local în consolă, executați o comandă $env:ComputerName.
PS C:> $env:ComputerNameJUNEB-TESTBOX
când încerc același lucru într-o aplicație GUI unde nu există consolă, nu văd niciun rezultat deloc. În acest exemplu, am creat un formular cu un buton care, atunci când faceți clic, rulează expresia $env:ComputerName.,
$buttonComputerName_Click = { <b>$env:Numecomputer</b>}
Dar, când m-am faceți clic pe butonul, nu se întâmplă nimic, chiar daca am o consola fereastra deschisă.
pentru a afișa numele computerului într-o aplicație GUI, adaug un control de afișare la formularul meu și atribuie ieșirea comenzii unei metode de control de afișare.,
de exemplu, pot adăuga un control al casetei de text la formular și pot folosi operatorul de atribuire (=) pentru a atribui rezultatul expresiei proprietății Text a casetei de text. Acum, când faceți clic pe buton, vedeți ieșirea din caseta de text.
$buttonComputerName_Click = { $textboxResults.Text = $env:Numecomputer}
Aici este rezultatul:
Afișare într-un Program Diferit
puteți afișa, de asemenea, de ieșire de comenzi în obiecte care nu fac parte din program., Profesioniștii GUI consideră că această abordare este neglijentă și nu este o bună practică, dar s-ar putea să vi se pară utilă pentru testare sau depanare.
de exemplu, puteți conduce ieșirea la cmdlet-ul Out-GridView.
$buttonComputerName_Click = { $env:Numecomputer | Out-GridView}
Aici este rezultatul:
de asemenea, puteți scrie într-un fișier și deschideți fișierul. Aceste comenzi de probă creează un fișier temporar, scriu în fișier și apoi folosesc Notepad pentru a afișa fișierul., Din nou, acest lucru face programatori reale piti, dar funcționează, cel puțin pentru testare.
iată rezultatul:
conversia în șiruri
o altă sarcină pe care trebuie să o gestionați într-o aplicație GUI este conversia obiectelor în șiruri de text. De obicei, acest lucru înseamnă doar conducte de ieșire la un cmdlet afară, cum ar fi Out-String. Out cmdlets, inclusiv Out-GridView, converti obiecte de date șir.când scrieți ieșire în consolă, Windows PowerShell adaugă automat o comandă Out-String la conductă., Dar, nu există nici o consolă și nici un automat Out-String într-o aplicație GUI.
când atribuiți obiecte non-string unui obiect string sau unui control care preia obiecte string, cum ar fi o casetă de text, Windows PowerShell apelează metoda toString() a obiectului. (În alte limbi, misiunea ar eșua, dar încearcă să ajute.) Cu unele obiecte, cum ar fi obiectele DateTime și ErrorRecord, toString () funcționează foarte bine, dar, în multe cazuri, produce rezultate ciudate.
de exemplu, această comandă atribuie rezultatele unei comenzi Get-Process unei casete de text., Windows PowerShell recunoaște că aveți nevoie de text și apelează metoda toString() a obiectelor de proces, dar rezultatul nu este util.
$buttonGetProcess_Click = { $textboxResults.Text = Get-Process}
Pentru a obține o reprezentare șir de default procesul masă, conducta de ieșire, pentru a-String cmdlet-ului și apoi atribuiți-l la caseta de text.
$buttonGetProcess_Click = { $textboxResults.,Text = Get-Process | Out-String}
SFAT: Pentru a face ieșire ușor de citit, setați caseta de text (sau rich text box) pentru a utiliza un font monospace. În PowerShell Studio, faceți clic dreapta pe caseta de text, faceți clic pe Aplicați setul de Proprietăți, apoi faceți clic pe Aplicați fontul consolei.
Nu evita toString () complet. Există câteva obiecte în care metoda toString () produce un rezultat util. Obiectele DateTime sunt exemplul clasic. Metoda toString () a unui obiect DateTime returnează un șir de format „short-date/long-time”. Out-String returnează un format” 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
#Folosește toString()$buttonGetDate_Click = { $textboxDate.Text = Get-Date}
#Folosește toString()$buttonGetDate_Click = { $textboxDate.Text = Get-Data | Out-String}
de asemenea, puteți utiliza Formatul și UFormat parametrii de la Data cmdlet-ului pentru a obține o dată formatat șir în aproape orice configurație., De exemplu, pentru a obține o dată în format RFC1123, utilizați-Format R (sau „r”). Nu este nevoie să treceți la Out-String atunci când utilizați Format sau UFormat, deoarece acești parametri forțează cmdlet-ul să returneze un șir.
PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT
Conversie Formatat Obiecte
In consola, Format cmdlet-uri, cum ar fi Format-Table, sunt, de obicei, ultimul element într-o conductă. Ieșirea arată excelent în consolă, deoarece Windows PowerShell adaugă o comandă Out-String la conductă înainte de a o trimite la consolă.,
dar, într-o aplicație GUI, în mod implicit, obțineți rezultatul apelării metodei toString() a obiectelor de format pe care le returnează cmdleturile de Format.
$buttonGetHotfix_Click = { $textboxHotFix.Text = Get-HotFix / Format-Table-Property HotFixID, InstalledOn-AutoSize}
pentru a obține un afișaj mai utilizabil în aplicația dvs.,
asta e mai bine!după un timp, sarcina de gestionare a afișajului de ieșire în aplicațiile GUI devine la fel de naturală ca tastarea unui nume cmdlet, dar în timp ce învățați, asigurați-vă că testați și asigurați-vă că toate ieșirile dvs. sunt capturate și afișate într-un format utilizabil.June Blender este Evanghelist în tehnologie la SAPIEN Technologies, Inc. Puteți ajunge la ea la [email protected] sau urmați-o pe Twitter la @ juneb_get_help.