Πώς τα Scopes επηρεάζουν τα PowerShell Scripts
Σε δέσμες ενεργειών δέσμης ενεργειών, οι αλλαγές στις μεταβλητές περιβάλλοντος έχουν παγκόσμιο αντίκτυπο στην τρέχουσα συνεδρία από προεπιλογή. Για το PowerShell, το ακριβώς αντίθετο ισχύει επειδή τα πεδία χρησιμοποιούνται για την απομόνωση των τροποποιήσεων ενός σεναρίου. Εδώ θα διερευνήσουμε τον τρόπο με τον οποίο τα πεδία επηρεάζουν τα σενάρια PowerShell και πώς να εργαστούν μέσα και γύρω τους.
Τι είναι το πεδίο εφαρμογής?
Στο PowerShell, ένα "πεδίο" αναφέρεται στο τρέχον περιβάλλον στο οποίο λειτουργεί ένα κέλυφος εντολών ή εντολών. Τα πεδία χρησιμοποιούνται για την προστασία συγκεκριμένων αντικειμένων μέσα στο περιβάλλον από την ανεπιθύμητη τροποποίηση τους από δέσμες ενεργειών ή λειτουργίες. Ιδιαίτερα, τα ακόλουθα πράγματα προστατεύονται από την τροποποίηση με εντολές που εκτελούνται από άλλο πεδίο, εκτός αν ορίζεται διαφορετικά από τις παραμέτρους στις εντολές αυτές:
- Μεταβλητές
- Ψευδώνυμα
- Λειτουργίες
- Δίσκοι PowerShell (PSDrives)
Δημιουργούνται νέα πεδία όταν εκτελείτε μια δέσμη ενεργειών ή μια συνάρτηση ή όταν δημιουργείτε μια νέα συνεδρία ή μια παρουσία του PowerShell. Τα πεδία που δημιουργούνται με τη λειτουργία σεναρίων και λειτουργιών έχουν μια σχέση "γονέα / παιδιού" με το πεδίο από το οποίο δημιουργήθηκαν. Υπάρχουν μερικά πεδία που έχουν ιδιαίτερα ιδιαίτερες έννοιες και μπορούν να αποκτήσουν πρόσβαση από το όνομα:
- ο Παγκόσμια πεδίο εφαρμογής είναι το πεδίο που δημιουργείται όταν ξεκινά το PowerShell. Περιλαμβάνει τις μεταβλητές, τα ψευδώνυμα, τις λειτουργίες και τα PSDrives που είναι ενσωματωμένα στο PowerShell καθώς και όσα παράγονται από το προφίλ σας PowerShell.
- ο Τοπικός πεδίο εφαρμογής αναφέρεται σε ό, τι είναι το σημερινό πεδίο εφαρμογής. Όταν ξεκινάτε το PowerShell θα αναφέρεται στο πεδίο Global, μέσα σε ένα script θα είναι το πεδίο Script, κλπ.
- ο Γραφή πεδίο δημιουργείται όταν εκτελείται μια δέσμη ενεργειών. Οι μόνες εντολές που λειτουργούν εντός αυτού του πεδίου είναι εκείνες που βρίσκονται στο σενάριο.
- Ιδιωτικός τα πεδία μπορούν να οριστούν εντός του σημερινού πεδίου εφαρμογής, ώστε να αποφευχθεί η δυνατότητα εντολών σε άλλα πεδία να διαβάζουν ή να τροποποιούν στοιχεία που διαφορετικά θα μπορούσαν να έχουν πρόσβαση.
Τα πεδία μπορούν επίσης να αναφέρονται με αριθμό σε ορισμένες εντολές, όπου το τρέχον πεδίο αναφέρεται ως μηδέν και οι πρόγονοί του αναφέρονται με την αύξηση των ακέραιων αριθμών. Για παράδειγμα, μέσα σε μια δέσμη ενεργειών από το πεδίο Global, το πεδίο δέσμης ενεργειών θα είναι 0 και το πεδίο παγκόσμιας εμβέλειας θα είναι 1. Ένα πεδίο που ήταν ακόμη ένθετο μέσα στο πεδίο δέσμης ενεργειών, όπως μια συνάρτηση, θα αναφέρεται στο πεδίο Global Οι αρνητικοί αριθμοί δεν θα λειτουργήσουν για να αναφερθούν τα παιδικά πεδία - ο λόγος για αυτό θα είναι σύντομα εμφανής.
Πώς το Scopes επηρεάζει τις εντολές
Όπως αναφέρθηκε προηγουμένως, οι εντολές που εκτελούνται εντός ενός πεδίου εφαρμογής δεν θα επηρεάσουν τα πράγματα σε άλλο πεδίο, εκτός αν συγκεκριμένα έχουν πει να το πράξουν. Για παράδειγμα, εάν το $ MyVar υπάρχει στο πεδίο Global και μια δέσμη ενεργειών τρέχει μια εντολή για να θέσει το $ MyVar σε διαφορετική τιμή, η γενική έκδοση του $ MyVar θα παραμείνει αναλλοίωτη ενώ ένα αντίγραφο $ MyVar τοποθετείται στο πεδίο Script με το νέο αξία. Εάν ένα $ MyVar δεν υπάρχει, μια δέσμη ενεργειών θα την δημιουργήσει στο πλαίσιο δέσμης ενεργειών δέσμης ενεργειών από προεπιλογή - όχι στο πεδίο "Παγκόσμια". Αυτό είναι σημαντικό να θυμάστε καθώς μαθαίνετε για την πραγματική σχέση γονέα / παιδιού μεταξύ των πεδίων.
Η σχέση γονέα / παιδιού των πεδίων στο PowerShell είναι μονόδρομη. Οι εντολές μπορούν να δουν και να τροποποιήσουν προαιρετικά το τρέχον πεδίο εφαρμογής, τον γονέα του και οποιαδήποτε πεδία πάνω από αυτό. Ωστόσο, δεν μπορούν να δουν ή να τροποποιήσουν τα πράγματα σε κανένα παιδί του σημερινού πεδίου εφαρμογής. Αυτό οφείλεται κυρίως στο ότι, μόλις μεταφερθείτε σε γονικό πεδίο, το πεδίο παιδιού έχει ήδη καταστραφεί επειδή έχει εκπληρώσει το σκοπό του. Για παράδειγμα, γιατί θα έπρεπε να δείτε ή να τροποποιήσετε μια μεταβλητή στο πεδίο Script, από το πεδίο Global, μετά τη λήξη της δέσμης ενεργειών; Υπάρχουν πολλές περιπτώσεις όπου χρειάζεστε τις αλλαγές ενός σεναρίου ή της λειτουργίας να επιμείνουν πέρα από την ολοκλήρωσή του, αλλά όχι τόσο πολλές, όπου θα χρειαστεί να κάνετε αλλαγές σε αντικείμενα εντός του πεδίου εφαρμογής του σεναρίου ή της λειτουργίας πριν ή μετά την εκτέλεση. (Συνήθως, τέτοια πράγματα θα αντιμετωπίζονται ως μέρος του σεναρίου ή της ίδιας της λειτουργίας ούτως ή άλλως.)
Φυσικά, ποιοι είναι οι κανόνες χωρίς εξαιρέσεις; Μία εξαίρεση από τα παραπάνω είναι τα Ιδιωτικά πεδία. Τα αντικείμενα στα Ιδιωτικά πεδία είναι διαθέσιμα μόνο σε εντολές που εκτελούνται στο πεδίο από το οποίο δημιουργήθηκαν. Μια άλλη σημαντική εξαίρεση είναι τα στοιχεία που έχουν την ιδιότητα AllScope. Πρόκειται για ειδικές μεταβλητές και ψευδώνυμα για τα οποία μια αλλαγή σε οποιοδήποτε πεδίο θα επηρεάσει όλα τα πεδία. Οι ακόλουθες εντολές θα σας δείξουν ποιες μεταβλητές και ψευδώνυμα έχουν την ιδιότητα AllScope:
Get-Μεταβλητή | Όπου-Αντικείμενο $ _. Επιλογές -Match 'AllScope' Get-Alias | Όπου-Αντικείμενο $ _. Επιλογές -Μέτρηση "AllScope")
Σκοπός της δράσης
Για την πρώτη μας ματιά στα πεδία δράσης, θα αρχίσουμε σε μια συνεδρία PowerShell όπου η μεταβλητή $ MyVar έχει οριστεί σε μια συμβολοσειρά, "Είμαι μια παγκόσμια μεταβλητή!", Από τη γραμμή εντολών. Στη συνέχεια, θα εκτελεστεί το ακόλουθο σενάριο από ένα αρχείο που ονομάζεται Scope-Demo.ps1:
Λειτουργία FunctionScope 'Αλλαγή $ MyVar με μια λειτουργία.' $ MyVar = 'Έχω ρυθμιστεί από μια συνάρτηση!' "MyVar λέει $ MyVar" "Έλεγχος τρέχουσας αξίας $ MyVar." "MyVar λέει $ MyVar" "Αλλάζοντας $ MyVar από script". $ MyVar = 'Ορίστηκε από ένα σενάριο!' "MyVar λέει $ MyVar" "FunctionScope" Έλεγχος της τελικής τιμής του MyVar πριν από την έξοδο του script. ' "MyVar λέει $ MyVar" "
Εάν τα σενάρια PowerShell λειτουργούσαν το ίδιο με τα δέσμη ενεργειών δέσμης, θα περίμενε κανείς ότι το vale του $ MyVar (ή το% MyVar% σε σύνθετη παρτίδα) θα αλλάξει από 'Είμαι μια παγκόσμια μεταβλητή!', Σε 'Έχω ρυθμιστεί από ένα σενάριο! , και τελικά να «έχω καθοριστεί από μια λειτουργία!" όπου θα παραμείνει μέχρι να αλλάξει ρητά ξανά ή η περίοδος σύνδεσης θα τερματιστεί. Ωστόσο, δείτε τι συμβαίνει στην πραγματικότητα εδώ καθώς κινούμαστε μέσα από κάθε πεδίο - ειδικά αφού η λειτουργία FunctionScope έχει ολοκληρώσει τη δουλειά της και ελέγξουμε ξανά τη μεταβλητή από το Script και αργότερα το Global scope.
Όπως βλέπετε, η μεταβλητή εμφανίστηκε να αλλάζει καθώς μετακινήσαμε τη δέσμη ενεργειών επειδή, μέχρι να ολοκληρωθεί η λειτουργία FunctionScope, ελέγχαμε τη μεταβλητή από το ίδιο αντικείμενο που άλλαξε τελευταία. Αφού έγινε το FunctionScope, μεταφέρθηκε και πάλι στο πεδίο δέσμης ενεργειών όπου το $ MyVar έμεινε ανέγγιχτο από τη λειτουργία. Στη συνέχεια, όταν το σενάριο τερμάτισε, επιστρέψαμε στην παγκόσμια εμβέλεια όπου δεν είχε τροποποιηθεί καθόλου.
Φτάνοντας εκτός τοπικού πεδίου
Επομένως, αυτό είναι καλό και καλό για να σας βοηθήσουμε να αποφύγετε τυχαία την εφαρμογή αλλαγών στο περιβάλλον πέρα από τα σενάρια και τις λειτουργίες σας, αλλά τι γίνεται αν θέλετε πραγματικά να κάνετε τέτοιες τροποποιήσεις; Υπάρχει μια ειδική και αρκετά απλή σύνταξη για τη δημιουργία και την τροποποίηση αντικειμένων πέρα από το Τοπικό πεδίο εφαρμογής. Μόλις τοποθετήσετε το όνομα του πεδίου εφαρμογής στην αρχή του ονόματος της μεταβλητής και βάλτε ένα παχύ τελεία ανάμεσα στο πεδίο και τα ονόματα των μεταβλητών. Σαν αυτό:
$ global: MyVar $ script: MyVar $ τοπικό: MyVar
Μπορείτε να χρησιμοποιήσετε αυτούς τους τροποποιητές τόσο κατά την προβολή και τη ρύθμιση των μεταβλητών. Ας δούμε τι συμβαίνει με αυτό το σενάριο επίδειξης:
Λειτουργία FunctionScope "Αλλάζοντας $ MyVar στο τοπικό εύρος λειτουργίας ..." $ local: MyVar = "Αυτό είναι το MyVar στο τοπικό πεδίο λειτουργίας της λειτουργίας." '$ MyVar στο πεδίο δέσμης ενεργειών ...' $ script: MyVar = 'MyVar "$ global: MyVar = 'Το MyVar έχει οριστεί στο παγκόσμιο πεδίο εφαρμογής. Τώρα ορίστηκε από μια λειτουργία. "Έλεγχος $ MyVar σε κάθε πεδίο ..." "Τοπικό: $ τοπικό: MyVar" "Σενάριο: $ script: MyVar" "Παγκόσμια: $ global: MyVar" " "MyVar λέει $ MyVar" "Αλλάζοντας $ MyVar από script". $ MyVar = 'Ορίστηκε από ένα σενάριο!' "Το MyVar λέει ότι το $ MyVar" FunctionScope "Έλεγχος του $ MyVar από το σενάριο πριν από την έξοδο." "MyVar λέει $ MyVar" "
Όπως και πριν, θα ξεκινήσουμε με τη ρύθμιση της μεταβλητής στο πεδίο Global και θα τελειώσουμε με τον έλεγχο του τελικού αποτελέσματος του Global scope.
Εδώ μπορείτε να δείτε ότι το FunctionScope κατάφερε να αλλάξει τη μεταβλητή στο πεδίο Script και να διατηρήσει τις αλλαγές μετά την ολοκλήρωσή του. Επίσης, η μεταβολή της μεταβλητής στην παγκόσμια εμβέλεια εξακολούθησε ακόμη και μετά την έξοδο του σεναρίου. Αυτό μπορεί να είναι ιδιαίτερα χρήσιμο εάν πρέπει να αλλάζετε επανειλημμένα τις μεταβλητές μέσα σε ένα σενάριο ή μέσα στην παγκόσμια εμβέλεια χρησιμοποιώντας τον ίδιο κώδικα - απλά ορίζετε μια συνάρτηση ή σενάριο που γράφεται για να τροποποιήσετε τη μεταβλητή όπου και πώς το χρειάζεστε και καλέστε το όποτε οι αλλαγές είναι απαραίτητες.
Όπως αναφέρθηκε προηγουμένως, οι αριθμοί εμβέλειας μπορούν επίσης να χρησιμοποιηθούν σε ορισμένες εντολές για να τροποποιήσουν τη μεταβλητή σε διαφορετικά επίπεδα σε σχέση με την Τοπική εμβέλεια. Ακολουθεί το ίδιο σενάριο που χρησιμοποιήθηκε στο δεύτερο παράδειγμα παραπάνω, αλλά με τη λειτουργία που τροποποιήθηκε για να χρησιμοποιήσει τις εντολές Get-Variable και Set-Variable με αριθμούς εύρους αντί για απευθείας αναφορά της μεταβλητής με ονόματα scopes:
Λειτουργία FunctionScope "Αλλάζοντας το $ MyVar στο πεδίο 0, σε σχέση με το FunctionScope ..." SetVariable MyVar "Αυτό είναι το MyVar στο πεδίο 0." -Scope 0 'Αλλαγή $ MyVar στο πεδίο 1, σε σχέση με το FunctionScope ...' Set-Variable Το MyVar 'MyVar άλλαξε στο πεδίο 1, από μια λειτουργία.' -Scope 1 'Αλλάζοντας το $ MyVar στο πεδίο 2, σε σχέση με το Functionscope ... Το "Set-Variable MyVar" MyVar άλλαξε στο πεδίο 2, από μια λειτουργία. -Σκόπιο 2 "Έλεγχος $ MyVar σε κάθε πεδίο ..." Πεδίο εφαρμογής 0: 'GetVariable MyVar -Scope 0 -ValueOnly' Πεδίο εφαρμογής 1: 'GetVariable MyVar -Scope 1 -ValueOnly' Πεδίο 2: 'GetVariable MyVar -Scope 2 -ValueOnly "" Λήψη της τρέχουσας τιμής του $ MyVar. " "MyVar λέει $ MyVar" "Αλλάζοντας $ MyVar από script". $ MyVar = 'Ορίστηκε από ένα σενάριο!' "Το MyVar λέει ότι το $ MyVar" FunctionScope "Έλεγχος του $ MyVar από το σενάριο πριν από την έξοδο." "MyVar λέει $ MyVar" "
Παρόμοια με τα προηγούμενα, μπορούμε να δούμε εδώ πώς οι εντολές σε ένα πεδίο εφαρμογής μπορούν να τροποποιήσουν αντικείμενα στο γονικό τους πεδίο.
Επιπλέον πληροφορίες
Υπάρχουν ακόμα πολλά περισσότερα που μπορούν να γίνουν με πεδία εκτός από αυτά που μπορούν να χωρέσουν σε αυτό το άρθρο. Τα σχήματα επηρεάζουν περισσότερο από τις μεταβλητές και υπάρχουν ακόμα πολλά που πρέπει να μάθουμε για τα Ιδιωτικά πεδία και τις μεταβλητές AllScope. Για περισσότερες χρήσιμες πληροφορίες, μπορείτε να εκτελέσετε την ακόλουθη εντολή από το PowerShell:
Get-Help about_scopes
Το ίδιο αρχείο βοήθειας διατίθεται επίσης στο TechNet.
Πεδίο κάλυψης εικόνας: spadassin σε openclipart