Σχολή Geek που εργάζεται με συλλογές στο PowerShell
Δεδομένου ότι το PowerShell βασίζεται στο .Net Framework και ενσωματώνει διάφορες άλλες τεχνολογίες όπως το WMI και το CIM, υπάρχουν πάντα περισσότεροι από ένας τρόποι να επιτευχθεί το ίδιο πράγμα. Ελάτε μαζί μας για αυτή τη σύντομη ανάρτηση, όπου μαθαίνουμε πώς να επιλέγουμε την καλύτερη μέθοδο για να πετύχουμε τα καθήκοντά μας.
Βεβαιωθείτε ότι έχετε διαβάσει τα προηγούμενα άρθρα της σειράς:
- Μάθετε πώς να αυτοματοποιήσετε τα Windows με το PowerShell
- Μάθηση χρήσης Cmdlets στο PowerShell
- Πώς να χρησιμοποιήσετε αντικείμενα στο PowerShell
- Εκμάθηση μορφοποίησης, φιλτράρισμα και σύγκριση σε PowerShell
- Μάθετε να χρησιμοποιείτε Remoting στο PowerShell
- Χρησιμοποιώντας το PowerShell για να λάβετε πληροφορίες υπολογιστή
Και μείνετε συντονισμένοι για όλη την εβδομάδα.
Χρησιμοποιώντας παραμέτρους παρτίδας
Νωρίτερα στη σειρά, όταν σας παρουσιάσαμε στον αγωγό, σας δείξαμε πώς μπορείτε να πάρετε τα αντικείμενα που εξάγει ένα cmdlet και να τα μεταβιβάσετε ως είσοδο σε ένα άλλο cmdlet χρησιμοποιώντας κάτι σαν αυτό:
Get-Process -Name σημειωματάριο | Διαδικασία διακοπής
Αυτό θα σκότωνε οποιαδήποτε διαδικασία με το όνομα "σημειωματάριο". Αλλά πιθανόν να αναρωτιέστε πώς το PowerShell είναι σε θέση να σκοτώσει κάθε περίπτωση σημειωματάριου με μία μόνο εντολή. Η απάντηση βρίσκεται μέσα στη βοήθεια του cmdlet Stop-Process.
Βοήθεια Stop-Process-Πλήρης
Αν κοιτάξετε την τελευταία γραμμή κώδικα στην ενότητα σύνταξης, μπορείτε να δείτε ότι η παράμετρος InputObject δέχεται ένα αντικείμενο τύπου Process [] και κάθε φορά που βλέπετε έναν τύπο που ακολουθείται από δύο αγκύλες όπως αυτή σημαίνει ότι η παράμετρος δέχεται ένα ή περισσότερα του προηγούμενου τύπου. Σε αυτή την περίπτωση, δέχεται ένα ή περισσότερα αντικείμενα διαδικασίας. Από τεχνική άποψη, θα λέγαμε ότι το cmdlet InputObject δέχεται μια διαδικασία παράταξη. Κάθε φορά που έχετε ένα cmdlet που υποστηρίζει λειτουργίες παρτίδας με αυτόν τον τρόπο, χρησιμοποιήστε το. Αυτή είναι η πρώτη επιλογή.
Χρησιμοποιώντας το WMI
Παρόλο που το WMI δεν είναι το καλύτερο κομμάτι της τεχνολογίας για να αποσταλεί από το κεντρικό τμήμα της Microsoft, το δεύτερο προστίθεται στη λίστα με τον τρόπο εργασίας με συλλογές αντικειμένων. Θα μπορούσαμε εύκολα να λάβουμε μια λίστα με τρέχουσες διεργασίες από την κλάση Win32_Process, όπως π.χ.:
Get-WmiObject-Κλάση Win32_Process
Δεδομένου ότι το ερώτημα WMI επιστρέφει το δικό του είδος αντικειμένου, θα πρέπει να αναζητήσετε μια μέθοδο που μπορεί να σταματήσει τη διαδικασία, οπότε αφήνει το σωλήνα αυτό στο Get-Member.
Get-WmiObject-Κλάση Win32_Process | Get-μέλος
Φαίνεται ότι το πιο κοντινό πράγμα που πρέπει να σταματήσουμε είναι η μέθοδος τερματισμού, έτσι πρέπει να είναι αυτή. Για να καλέσετε μια μέθοδο σε ένα αντικείμενο WMI, απλώς το διοχετεύετε στο Invoke-WmiMethod και καθορίστε το όνομα της μεθόδου.
Get-WmiObject - Κλάση Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-Να τερματίσει
Μεγάλο, αυτό έκανε το τέχνασμα. Κάθε φορά που παίρνετε ReturnValue 0 στο WMI, θυμηθείτε ότι η εντολή εκτελέστηκε με επιτυχία.
Απαρίθμηση
Σε περίπτωση αποτυχίας των άλλων δύο μεθόδων, εάν πρέπει να κάνετε κάτι σε μια δέσμη αντικειμένων, μπορείτε να απαριθμήσετε ολόκληρο το αντικείμενο και να δράσετε σε κάθε μεμονωμένο αντικείμενο. Πρώτα πρέπει να βρείτε τη μέθοδο που θα χρησιμοποιούσατε για να σταματήσετε μια ενιαία διαδικασία.
Get-Process | Μέθοδος Get-Member -MemberType
Τέλεια, μοιάζει να μπορούμε να χρησιμοποιήσουμε τη μέθοδο Kill και στη συνέχεια να διοχετεύσουμε το ForEach-Object για να τα σκοτώσουμε όλα.
Get-Process -Name σημειωματάριο | ForEach-Object -Process $ _.Kill ()
Εδώ πήραμε όλα τα αντικείμενα της διαδικασίας που επέστρεψε η Get-Process και τα πέρασαν στο cmdlet ForEach-Object. Όπως και το cmdlet Where-Object, εκπροσωπούσαμε κάθε αντικείμενο στη γραμμή με $ _ το οποίο μπορούσαμε να καλέσουμε στη μέθοδο Kill (). Με όλα όσα είπαν και έκαναν, η απαρίθμηση μιας συλλογής είναι πολύ πιο αργή από τις παραπάνω μεθόδους και πρέπει να χρησιμοποιηθεί μόνο ως τελευταίο αποτέλεσμα.
Περίληψη
Επιλογή One
Get-Process -Name σημειωματάριο | Διαδικασία διακοπής
Επιλογή Δύο
Get-WmiObject - Κλάση Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-Να τερματίσει
Επιλογή Τρία
Get-Process -Name σημειωματάριο | ForEach-Object -Process $ _.Kill ()
Αυτό είναι όλο για τους ανθρώπους αυτού του χρόνου, θα σας δούμε την επόμενη εβδομάδα για περισσότερη διασκέδαση PowerShell.