Η έξοδος κειμένου των εντολών στο παράθυρο διερμηνέα PowerShell είναι απλώς ένας τρόπος εμφάνισης πληροφοριών σε μορφή κατάλληλη για την ανθρώπινη αντίληψη. Για την ακρίβεια Τετάρτη
Πίνακας περιεχομένων:
Αντικείμενα στο PowerShell
Ας υπενθυμίσουμε ότι ένα αντικείμενο είναι μια συλλογή από πεδία δεδομένων (ιδιότητες, συμβάντα κ.λπ.) και μεθόδους επεξεργασίας τους (μέθοδοι). Η δομή του καθορίζεται από έναν τύπο, ο οποίος συνήθως βασίζεται σε κλάσεις που χρησιμοποιούνται στην ενοποιημένη πλατφόρμα .NET Core. Είναι επίσης δυνατή η εργασία με αντικείμενα COM, CIM (WMI) και ADSI. Απαιτούνται ιδιότητες και μέθοδοι για την εκτέλεση διαφόρων ενεργειών σε δεδομένα· επιπλέον, στο PowerShell, τα αντικείμενα μπορούν να περάσουν ως ορίσματα σε συναρτήσεις και cmdlet, να εκχωρηθούν οι τιμές τους σε μεταβλητές και υπάρχει επίσης
Προβολή της δομής των αντικειμένων
Για παράδειγμα, ας εκτελέσουμε το cmdlet Get-Process, το οποίο σας επιτρέπει να λαμβάνετε πληροφορίες σχετικά με τις διεργασίες που εκτελούνται στο σύστημα:
Θα εμφανίσει ορισμένα μορφοποιημένα δεδομένα κειμένου που δεν δίνουν καμία ιδέα για τις ιδιότητες των επιστρεφόμενων αντικειμένων και τις μεθόδους τους. Για να τελειοποιήσουμε την έξοδο, πρέπει να μάθουμε πώς να εξετάζουμε τη δομή των αντικειμένων και το cmdlet Get-Member θα μας βοηθήσει σε αυτό:
Get-Process | Get-Member
Εδώ βλέπουμε ήδη τον τύπο και τη δομή και με τη βοήθεια πρόσθετων παραμέτρων μπορούμε, για παράδειγμα, να εμφανίσουμε μόνο τις ιδιότητες του αντικειμένου που περιλαμβάνεται στην είσοδο:
Get-Process | Get-Member -MemberType Property
Αυτή η γνώση θα χρειαστεί για να λύσετε προβλήματα διαχείρισης διαδραστικά ή για να γράψετε τα δικά σας σενάρια: για παράδειγμα, για να λάβετε πληροφορίες σχετικά με αναρτημένες διεργασίες χρησιμοποιώντας την ιδιότητα Απάντηση.
Φιλτράρισμα αντικειμένων
Το PowerShell επιτρέπει τη διέλευση αντικειμένων που πληρούν μια συγκεκριμένη συνθήκη μέσω ενός αγωγού:
Where-Object { блок сценария }
Το αποτέλεσμα της εκτέλεσης του μπλοκ σεναρίου μέσα στις παρενθέσεις πρέπει να είναι μια δυαδική τιμή. Εάν είναι true ($true), το αντικείμενο που εισάγεται στο Where-Object cmdlet θα μεταβιβαστεί κατά μήκος του pipeline, διαφορετικά ($false) θα διαγραφεί. Για παράδειγμα, ας εμφανιστεί μια λίστα με τις υπηρεσίες Windows Server που έχουν σταματήσει, π.χ. εκείνοι των οποίων η ιδιότητα Κατάσταση έχει οριστεί σε "Διακοπή":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Εδώ πάλι βλέπουμε μια αναπαράσταση κειμένου, αλλά αν θέλετε να κατανοήσετε τον τύπο και την εσωτερική δομή των αντικειμένων που περνούν από τον αγωγό, δεν είναι δύσκολο:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Ταξινόμηση αντικειμένων
Κατά την επεξεργασία αντικειμένων με αγωγό, συχνά υπάρχει ανάγκη ταξινόμησης τους. Στο cmdlet Sort-Object μεταβιβάζονται τα ονόματα των ιδιοτήτων (κλειδιά ταξινόμησης) και επιστρέφει αντικείμενα ταξινομημένα με βάση τις τιμές τους. Είναι εύκολο να ταξινομήσετε την έξοδο των διεργασιών που εκτελούνται με βάση τον χρόνο που δαπανάται CPU (ιδιότητα cpu):
Get-Process | Sort-Object –Property cpu
Η παράμετρος -Ιδιότητα μπορεί να παραλειφθεί κατά την κλήση του cmdlet Sort-Object· χρησιμοποιείται από προεπιλογή. Για αντίστροφη ταξινόμηση, χρησιμοποιήστε την παράμετρο -Φθίνουσα:
Get-Process | Sort-Object cpu -Descending
Επιλογή αντικειμένων και μερών τους
Το cmdlet Select-Object σάς επιτρέπει να επιλέξετε έναν συγκεκριμένο αριθμό αντικειμένων στην αρχή ή στο τέλος ενός αγωγού χρησιμοποιώντας τις παραμέτρους -First ή -Last. Με τη βοήθειά του, μπορείτε να επιλέξετε μεμονωμένα αντικείμενα ή ορισμένες ιδιότητες, καθώς και να δημιουργήσετε νέα αντικείμενα με βάση αυτά. Ας δούμε πώς λειτουργεί το cmdlet χρησιμοποιώντας απλά παραδείγματα.
Η ακόλουθη εντολή εμφανίζει πληροφορίες σχετικά με τις 10 διεργασίες που καταναλώνουν τη μέγιστη ποσότητα μνήμης RAM (ιδιότητα WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Μπορείτε να επιλέξετε μόνο ορισμένες ιδιότητες των αντικειμένων που διέρχονται από τη διοχέτευση και να δημιουργήσετε νέες με βάση αυτές:
Get-Process | Select-Object ProcessName, Id -First 1
Ως αποτέλεσμα της λειτουργίας του αγωγού, θα λάβουμε ένα νέο αντικείμενο, η δομή του οποίου θα διαφέρει από τη δομή που επιστρέφεται από το cmdlet Get-Process. Ας το επαληθεύσουμε χρησιμοποιώντας το Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Σημειώστε ότι το Select-Object επιστρέφει ένα μεμονωμένο αντικείμενο (-First 1) που έχει μόνο δύο από τα πεδία που καθορίσαμε: οι τιμές τους αντιγράφηκαν από το πρώτο αντικείμενο που μεταβιβάστηκε στη διοχέτευση από το cmdlet Get-Process. Ένας από τους τρόπους δημιουργίας αντικειμένων σε σενάρια PowerShell βασίζεται στη χρήση Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Χρησιμοποιώντας το Select-Object, μπορείτε να προσθέσετε υπολογισμένες ιδιότητες σε αντικείμενα που πρέπει να αναπαρασταθούν ως
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Ας δούμε τη δομή των αντικειμένων που διέρχονται από τον μεταφορέα:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object και Measure-Object
Υπάρχουν και άλλα cmdlet για εργασία με αντικείμενα. Για παράδειγμα, ας μιλήσουμε για τα τρία πιο χρήσιμα:
Για κάθε αντικείμενο σας επιτρέπει να εκτελέσετε τον κώδικα PowerShell για κάθε αντικείμενο στη διοχέτευση:
ForEach-Object { блок сценария }
Ομάδα-Αντικείμενο ομαδοποιεί αντικείμενα κατά αξία ιδιότητας:
Group-Object PropertyName
Εάν το εκτελέσετε με την παράμετρο -NoElement, μπορείτε να μάθετε τον αριθμό των στοιχείων στις ομάδες.
Μέτρο-Αντικείμενο συγκεντρώνει διάφορες συνοπτικές παραμέτρους ανά τιμές πεδίου αντικειμένου στον αγωγό (υπολογίζει το άθροισμα και βρίσκει επίσης την ελάχιστη, τη μέγιστη ή τη μέση τιμή):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Συνήθως, τα cmdlet που συζητήθηκαν χρησιμοποιούνται διαδραστικά και συχνά δημιουργούνται σε σενάρια.
Δημιουργία αντικειμένων .NET και COM (New-Object)
Υπάρχουν πολλά στοιχεία λογισμικού με διεπαφές .NET Core και COM που είναι χρήσιμα για τους διαχειριστές συστήματος. Χρησιμοποιώντας την κλάση System.Diagnostics.EventLog, μπορείτε να διαχειριστείτε αρχεία καταγραφής συστήματος απευθείας από το Windows PowerShell. Ας δούμε ένα παράδειγμα δημιουργίας μιας παρουσίας αυτής της κλάσης χρησιμοποιώντας το cmdlet New-Object με την παράμετρο -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Εφόσον δεν καθορίσαμε ένα συγκεκριμένο αρχείο καταγραφής συμβάντων, η προκύπτουσα παρουσία της κλάσης δεν περιέχει δεδομένα. Για να το αλλάξετε αυτό, πρέπει να καλέσετε μια ειδική μέθοδο κατασκευής κατά τη δημιουργία της χρησιμοποιώντας την παράμετρο -ArgumentList. Εάν θέλουμε να αποκτήσουμε πρόσβαση στο αρχείο καταγραφής της εφαρμογής, θα πρέπει να περάσουμε τη συμβολοσειρά "Application" ως όρισμα στον κατασκευαστή:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Λάβετε υπόψη ότι αποθηκεύσαμε την έξοδο της εντολής στη μεταβλητή $AppLog. Αν και οι αγωγοί χρησιμοποιούνται συνήθως σε διαδραστική λειτουργία, η σύνταξη σεναρίων απαιτεί συχνά τη διατήρηση μιας αναφοράς σε ένα αντικείμενο. Επιπλέον, οι κλάσεις πυρήνα .NET Core περιέχονται στον χώρο ονομάτων του συστήματος: Το PowerShell από προεπιλογή αναζητά συγκεκριμένους τύπους σε αυτό, επομένως η εγγραφή Diagnostics.EventLog αντί για System.Diagnostics.EventLog είναι πολύ σωστή.
Για να εργαστείτε με το αρχείο καταγραφής, μπορείτε να χρησιμοποιήσετε τις κατάλληλες μεθόδους:
$AppLog | Get-Member -MemberType Method
Ας υποθέσουμε ότι διαγράφεται με τη μέθοδο Clear() εάν υπάρχουν δικαιώματα πρόσβασης:
$AppLog.Clear()
Το cmdlet New-Object χρησιμοποιείται επίσης για εργασία με στοιχεία COM. Υπάρχουν πολλά από αυτά - από τις βιβλιοθήκες που παρέχονται με τον διακομιστή script των Windows έως τις εφαρμογές ActiveX, όπως ο Internet Explorer. Για να δημιουργήσετε ένα αντικείμενο COM, πρέπει να ορίσετε την παράμετρο -ComObject με το προγραμματιστικό ProgId της επιθυμητής κλάσης:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Για να δημιουργήσετε τα δικά σας αντικείμενα με αυθαίρετη δομή, η χρήση του New-Object φαίνεται πολύ αρχαϊκή και δυσκίνητη· αυτό το cmdlet χρησιμοποιείται για εργασία με στοιχεία λογισμικού εκτός του PowerShell. Σε επόμενα άρθρα αυτό το θέμα θα συζητηθεί με περισσότερες λεπτομέρειες. Εκτός από τα αντικείμενα .NET και COM, θα εξερευνήσουμε επίσης αντικείμενα CIM (WMI) και ADSI.
Κλήση στατικών μεθόδων
Ορισμένες κλάσεις .NET Core δεν μπορούν να δημιουργηθούν, συμπεριλαμβανομένων των System.Environment και System.Math. Αυτοί είναι
[System.Environment] | Get-Member
Για να προβάλετε μόνο στατικά μέλη, καλέστε το Get-Member με την παράμετρο -Static (σημειώστε τον τύπο αντικειμένου):
[System.Environment] | Get-Member -Static
Για να αποκτήσετε πρόσβαση στις στατικές ιδιότητες και μεθόδους, χρησιμοποιήστε δύο διαδοχικές άνω και κάτω τελείες αντί για τελεία μετά την κυριολεξία:
[System.Environment]::OSVersion
Ή
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Πληκτρολογήστε PSCustomObject
Μεταξύ των πολυάριθμων τύπων δεδομένων που διατίθενται στο PowerShell, αξίζει να αναφέρουμε το PSCustomObject, σχεδιασμένο για την αποθήκευση αντικειμένων με αυθαίρετη δομή. Η δημιουργία ενός τέτοιου αντικειμένου χρησιμοποιώντας το cmdlet New-Object θεωρείται ένας κλασικός, αλλά δυσκίνητος και ξεπερασμένος τρόπος:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Ας δούμε τη δομή του αντικειμένου:
$object | Get-Member
Ξεκινώντας με το PowerShell 3.0, είναι διαθέσιμη μια άλλη σύνταξη:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Μπορείτε να αποκτήσετε πρόσβαση στα δεδομένα με έναν από τους ισοδύναμους τρόπους:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Ακολουθεί ένα παράδειγμα μετατροπής ενός υπάρχοντος hashtable σε αντικείμενο:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Ένα από τα μειονεκτήματα των αντικειμένων αυτού του τύπου είναι ότι η σειρά των ιδιοτήτων τους μπορεί να αλλάξει. Για να αποφύγετε αυτό, πρέπει να χρησιμοποιήσετε το χαρακτηριστικό [ordered]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Υπάρχουν και άλλες επιλογές για τη δημιουργία ενός αντικειμένου: παραπάνω εξετάσαμε τη χρήση του cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Το cmdlet Add-Member σάς επιτρέπει να προσθέσετε όχι μόνο ιδιότητες, αλλά και μεθόδους σε ένα $object που δημιουργήθηκε προηγουμένως χρησιμοποιώντας την κατασκευή "-MemberType ScriptMethod":
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Λάβετε υπόψη ότι χρησιμοποιήσαμε τη μεταβλητή $ScriptBlock τύπου ScriptBlock για να αποθηκεύσουμε τον κώδικα για τη νέα μέθοδο.
Για να αφαιρέσετε ιδιότητες, χρησιμοποιήστε την αντίστοιχη μέθοδο:
$object.psobject.properties.remove('Name')
Δημιουργώντας τις δικές σας τάξεις
Το PowerShell 5.0 εισήγαγε τη δυνατότητα ορισμού
class MyClass
{
# тело класса
}
Αυτός είναι ένας πραγματικός τύπος .NET Core, με σώμα που περιγράφει τις ιδιότητες, τις μεθόδους και άλλα στοιχεία του. Ας δούμε ένα παράδειγμα ορισμού της απλούστερης κλάσης:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Για να δημιουργήσετε ένα αντικείμενο (στιγμιότυπο κλάσης), χρησιμοποιήστε το cmdlet
$object = New-Object -TypeName MyClass
ή
$object = [MyClass]::new()
Ας αναλύσουμε τη δομή του αντικειμένου:
$object | Get-Member
Μην ξεχνάτε το εύρος: δεν μπορείτε να αναφέρετε ένα όνομα τύπου ως συμβολοσειρά ή να χρησιμοποιήσετε έναν τύπο κυριολεκτικά έξω από το σενάριο ή την ενότητα στην οποία ορίζεται η κλάση. Σε αυτήν την περίπτωση, οι συναρτήσεις μπορούν να επιστρέψουν στιγμιότυπα κλάσης (αντικείμενα) που θα είναι προσβάσιμα εκτός της λειτουργικής μονάδας ή του σεναρίου.
Αφού δημιουργήσετε το αντικείμενο, συμπληρώστε τις ιδιότητές του:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Σημειώστε ότι η περιγραφή κλάσης καθορίζει όχι μόνο τους τύπους ιδιοτήτων, αλλά και τις προεπιλεγμένες τιμές τους:
class Example
{
[string]$Name = 'John Doe'
}
Η περιγραφή μιας μεθόδου κλάσης μοιάζει με την περιγραφή μιας συνάρτησης, αλλά χωρίς τη χρήση της λέξης συνάρτησης. Όπως σε μια συνάρτηση, οι παράμετροι μεταβιβάζονται στις μεθόδους εάν είναι απαραίτητο:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Τώρα ο εκπρόσωπος της τάξης μας μπορεί να χαμογελάσει:
$object = [MyClass]::new()
$object.Smile($true)
Οι μέθοδοι μπορούν να υπερφορτωθούν· επιπλέον, μια τάξη έχει
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Η περιγραφή μας για την εργασία με αντικείμενα στο PowerShell δεν είναι καθόλου εξαντλητική. Στις επόμενες δημοσιεύσεις, θα προσπαθήσουμε να το εμβαθύνουμε με πρακτικά παραδείγματα: το πέμπτο άρθρο της σειράς θα αφιερωθεί στα ζητήματα της ενοποίησης του PowerShell με στοιχεία λογισμικού τρίτων κατασκευαστών. Τα προηγούμενα μέρη μπορείτε να τα βρείτε στους παρακάτω συνδέσμους.
Πηγή: www.habr.com