29Aug
Το PowerShell διαθέτει τέσσερις τύπους εργασιών - Εργασίες στο παρασκήνιο, Απομακρυσμένες εργασίες, Εργασίες WMI και Προγραμματισμένες εργασίες.Ελάτε μαζί μας καθώς ανακαλύπτουμε τι είναι και πώς μπορούμε να τις χρησιμοποιήσουμε.
Να είστε βέβαιος να διαβάσετε τα προηγούμενα άρθρα της σειράς:
- Μάθετε πώς να αυτοματοποιήσετε τα Windows με το PowerShell
- Μάθετε πώς να χρησιμοποιείτε το Cmdlets στο PowerShell
- Μάθετε πώς να χρησιμοποιείτε αντικείμενα στο PowerShell
- Μάθετε να χρησιμοποιείτε Remoting inPowerShell
- Χρήση του PowerShell για να λάβετε πληροφορίες υπολογιστή
- Εργασία με τις συλλογές στο PowerShell
Και μείνετε συντονισμένοι για την υπόλοιπη σειρά όλη την εβδομάδα.
Εργασίες φόντου
Μέχρι τώρα όλα τα οποία σας έδειξα στο PowerShell έχουν συγχρονισθεί, πράγμα που σημαίνει ότι πληκτρολογούμε κάτι στο κέλυφος και δεν μπορούμε πραγματικά να κάνουμε πολλά μέχρι να ολοκληρωθεί η εκτέλεση αυτής της εντολής.Αυτό είναι όπου έρχονται οι εργασίες φόντου. Για να ξεκινήσετε ένα φόντο, η εργασία απλά μεταβιβάζει ένα μπλοκ δέσμης ενεργειών στο cmdlet Έναρξη εργασίας.
Start-Job -Πάντα GetFileList -Scriptblock{ Get-ChildItem C: \ -Recurse}
Τώρα είμαστε ελεύθεροι να κάνουμε ό, τι θέλουμε μέσα στο κέλυφος ενώ το block script εκτελείται στο παρασκήνιο.
Όταν ξεκινάτε μια νέα εργασία, το PowerShell δημιουργεί ένα νέο αντικείμενο εργασίας που αντιπροσωπεύει αυτή την εργασία.Μπορείτε να πάρετε μια λίστα όλων των εργασιών ανά πάσα στιγμή εκτελώντας το cmdlet Get-Job.
Τα αντικείμενα εργασίας σας ενημερώνουν για την κατάσταση των εργασιών.Για παράδειγμα, στο παραπάνω screenshot μπορούμε να δούμε ότι έχουμε ένα BackgroundJob που ονομάζεται GetFileList το οποίο είναι ακόμα σε λειτουργία, αλλά έχει ήδη αρχίσει να επιστρέφει δεδομένα.Εάν σε οποιοδήποτε σημείο αποφασίσετε ότι η εργασία εκτελείται για πολύ καιρό, μπορείτε εύκολα να την σταματήσετε, διοχετεύοντάς την στο Stop-Job.
Get-Job - Όνομα GetFileList |Stop-Job
Εντούτοις, μόλις σταματήσετε μια εργασία, όσα δεδομένα έλαβε μέχρι το σημείο που σταματήσατε είναι ακόμα διαθέσιμο.Υπάρχει, όμως, ένα gotcha.Στο PowerShell, μόλις λάβετε τα αποτελέσματα για μια εργασία, θα διαγραφούν.Προκειμένου να παραμείνουν, πρέπει να καθορίσετε την παράμετρο του διακόπτη κρατήματος της εντολής λήψης.
Get-Job -Name GetFileList |Λήψη εργασίας-Κρατήστε
Μόλις τελειώσετε με μια εργασία, είναι καλύτερο να την αφαιρέσετε.Για να καταργήσετε την εργασία, απλώς θα την οδηγήσετε στο cmdlet Remove-Job.
Get-Job - Να πάρει GetFileList |Remove-Job
Αυτό θα το αφαιρέσει από τη λίστα των εργασιών που επιστρέφονται από το Get-Job.
Απομακρυσμένες Εργασίες
Πριν από μερικά μαθήματα, εξετάσαμε πώς μπορούμε να χρησιμοποιήσουμε remoting για να εκτελέσουμε τις εντολές PowerShell σε απομακρυσμένο μηχάνημα χρησιμοποιώντας το Invoke Command, αλλά ξέρατε ότι μπορείτε επίσης να χρησιμοποιήσετε το Invoke Command για να ξεκινήσετε μια εργασία remoting στο παρασκήνιο;Για να το κάνετε αυτό, απλά προσθέστε την παράμετρο -AsJob στο τέλος της εντολής σας:
Invoke-Command -ComputerName Flash, Viper -Credential διαχειριστής -ScriptBlock{ gci} -AsJob
Αυτή ήταν μια απλή εντολή και έπρεπε να έχει ολοκληρωθεί μέχρι τώρααφήνει να ρίξετε μια ματιά στην κατάσταση των θέσεων εργασίας μας.
Χμμ, μοιάζει να απέτυχε.Αυτό με φέρνει στην πρώτη μου gotcha με δουλειές.Όταν δημιουργείτε μια νέα εργασία οποιασδήποτε μορφής στο PowerShell, δημιουργεί μια εργασία γονέα εκτός από μια εργασία παιδιού για κάθε υπολογιστή στον οποίο εκτελείτε την εργασία.Όταν χρησιμοποιείτε το cmdlet Get-Job, εμφανίζει μόνο τις γονικές εργασίες και η ιδιότητα του κράτους είναι το σενάριο χειρότερης περίπτωσης, πράγμα που σημαίνει ότι ακόμα και αν η εντολή δεν εκτελέστηκε μόνο σε έναν στους εκατό υπολογιστές,απέτυχε.Για να δείτε μια λίστα με τις εργασίες παιδιού, πρέπει να χρησιμοποιήσετε την παράμετρο IncludeChildJob.
Αν κοιτάξετε πιο κοντά, θα δείτε ότι η δουλειά όντως αποτυγχάνει μόνο σε έναν υπολογιστή, που μας φέρνει στην επόμενη γκανιότα.Όταν προσπαθείτε να λάβετε τα αποτελέσματα για την εργασία, εάν καθορίσετε το όνομα εργασίας ή το αναγνωριστικό γονέα, το PowerShell θα επιστρέψει τα δεδομένα από όλες τις εργασίες παιδιού.Το πρόβλημα είναι ότι εάν υπήρχε ένα σφάλμα σε μια από τις θέσεις εργασίας του παιδιού, θα μείνει με κάποιο κόκκινο κείμενο.
Υπάρχουν δύο τρόποι να περάσετε γύρω από αυτό.Πρώτον, εάν γνωρίζετε σε ποιους υπολογιστές θέλετε τα αποτελέσματα, μπορείτε απλά να χρησιμοποιήσετε την παράμετρο ComputerName του cmdlet Recieve -Job.
Get-Job -Id 3 |Receive-Job -Keep -ComputerName Viper
Εναλλακτικά, μπορείτε να λάβετε τα αποτελέσματα από μια συγκεκριμένη εργασία παιδιού χρησιμοποιώντας το αναγνωριστικό της εργασίας.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 |Λήψη εργασίας-Κρατήστε
Θέσεις εργασίας WMI
Οι εργασίεςWMI είναι πολύ ίδιες με τις απομακρυσμένες εργασίες, απαιτώντας να προστεθεί μόνο η παράμετρος -AsJob στο cmdlet Get-WmiObject.
Δυστυχώς, αυτό σημαίνει ότι υπόκεινται επίσης στο ίδιο gotch που ανέφερα στην ενότητα Remote Jobs.
προγραμματισμένες εργασίες
Τα τελευταία τρία είδη εργασιών που εξετάσαμε δεν ήταν επίμονα, που σημαίνει ότι είναι διαθέσιμα μόνο στην τρέχουσα συνεδρία σας.Βασικά, αυτό σημαίνει ότι αν ξεκινήσετε μια δουλειά και στη συνέχεια ανοίξετε μια άλλη κονσόλα PowerShell και τρέξετε το Get-Job, δεν θα δείτε καμία εργασία.Ωστόσο, επιστρέψτε στην κονσόλα από την οποία ξεκίνησε η εργασία, θα μπορείτε να δείτε την κατάστασή της.Αυτό έρχεται σε αντίθεση με τις Προγραμματισμένες Εργασίες, οι οποίες είναι επίμονες .Βασικά, μια προγραμματισμένη εργασία είναι ένα μπλοκ δέσμης ενεργειών που λειτουργεί με χρονοδιάγραμμα.Στο παρελθόν, η ίδια επίδραση θα μπορούσε να επιτευχθεί με τη χρήση του Task Scheduler των Windows, πράγμα που συμβαίνει πραγματικά κάτω από την κουκούλα.Για να δημιουργήσετε μια νέα προγραμματισμένη εργασία, κάνουμε τα εξής:
Εγγραφή-ΠρογραμματισμένηJob -Παρακαλώ GetEventLogs -ScriptBlock{ Get-EventLog -LogName Ασφάλεια -Newest 100} -Trigger( New-JobTrigger -Daily -At 5pm) -ΠρογραμματισμένηJobOption( New-ScheduledJobOption-RunElevated)
Υπάρχει κάτι πολύ σε αυτή την εντολή, οπότε ας το σπάσουμε.
- Πρώτον, δίνουμε στο Scheduled Job το όνομα του GetEventLogs.
- Στη συνέχεια, λέμε ότι όταν ενεργοποιείται, θέλουμε να εκτελέσει τα περιεχόμενα του καθορισμένου μπλοκ δέσμης ενεργειών, το οποίο βασικά λαμβάνει τις νεότερες 100 καταχωρήσεις του αρχείου καταγραφής συμβάντων ασφαλείας.
- Στη συνέχεια, καθορίζουμε μια σκανδάλη.Δεδομένου ότι η παράμετρος σκανδαλισμού παίρνει ένα αντικείμενο σκανδάλης ως είσοδο, χρησιμοποιήσαμε μια παρενθετική εντολή για να δημιουργήσουμε μια σκανδάλη που θα σβήνει κάθε μέρα στις 5 μ.μ.
- Δεδομένου ότι έχουμε να κάνουμε με το αρχείο καταγραφής συμβάντων, πρέπει να τρέξουμε ως διαχειριστής, τον οποίο μπορούμε να καθορίσουμε δημιουργώντας ένα νέο αντικείμενο ScheduledJobOption και μεταβιβάζοντάς το στην παράμετρο ScheduledJobOption.
Δεδομένου ότι πρόκειται για έναν ελαφρώς διαφορετικό τύπο εργασίας, θα χρειαστεί επίσης να χρησιμοποιήσετε μια διαφορετική εντολή για να ανακτήσετε μια λίστα με όλες τις προγραμματισμένες εργασίες σε ένα μηχάνημα.
Get-ScheduledJob
Αυτό είναι όλο που υπάρχει σε αυτό.