Πώς τα πεδία επηρεάζουν τα σενάρια PowerShell



Στα σενάρια δέσμης, οι αλλαγές στις μεταβλητές περιβάλλοντος έχουν σφαιρικό αντίκτυπο στην τρέχουσα περίοδο λειτουργίας από προεπιλογή. Για το PowerShell, ισχύει ακριβώς το αντίθετο, επειδή τα πεδία χρησιμοποιούνται για την απομόνωση των τροποποιήσεων ενός σεναρίου. Εδώ, θα διερευνήσουμε πώς τα πεδία επηρεάζουν τα σενάρια PowerShell και πώς να εργάζονται μέσα και γύρω από αυτά.

Τι είναι ένα πεδίο εφαρμογής;

Στο PowerShell, ένα εύρος αναφέρεται στο τρέχον περιβάλλον στο οποίο λειτουργεί ένα σενάριο ή ένα κέλυφος εντολών. Τα πεδία χρησιμοποιούνται για την προστασία ορισμένων αντικειμένων στο περιβάλλον από ακούσια τροποποίηση από σενάρια ή λειτουργίες. Ειδικότερα, τα ακόλουθα στοιχεία προστατεύονται από τροποποίηση από εντολές που εκτελούνται από άλλο πεδίο, εκτός εάν ορίζεται διαφορετικά από τις παραμέτρους σε αυτές τις εντολές:





  • Μεταβλητές
  • Ψευδώνυμα
  • Λειτουργίες
  • Δίσκοι PowerShell (PSDrives)

Δημιουργούνται νέα πεδία κάθε φορά που εκτελείτε ένα σενάριο ή μια συνάρτηση ή όταν δημιουργείτε μια νέα περίοδο λειτουργίας ή παρουσία του PowerShell. Τα πεδία που δημιουργούνται από την εκτέλεση σεναρίων και συναρτήσεων έχουν σχέση γονέα/παιδιού με το εύρος από το οποίο δημιουργήθηκαν. Υπάρχουν μερικά πεδία που έχουν ιδιαίτερα ειδικές σημασίες και είναι προσβάσιμα με το όνομα:

  • ο Παγκόσμια scope είναι το εύρος που δημιουργείται κατά την εκκίνηση του PowerShell. Περιλαμβάνει τις μεταβλητές, τα ψευδώνυμα, τις συναρτήσεις και τις μονάδες PSD που είναι ενσωματωμένες στο PowerShell καθώς και οποιεσδήποτε δημιουργούνται από το προφίλ σας στο PowerShell.
  • ο Τοπικός Το πεδίο εφαρμογής αναφέρεται σε όποιο κι αν είναι το τρέχον πεδίο εφαρμογής. Όταν ξεκινάτε το PowerShell θα αναφέρεται στο καθολικό εύρος, μέσα σε ένα σενάριο θα είναι το πεδίο δέσμης ενεργειών κ.λπ.
  • ο Γραφή Το πεδίο εφαρμογής δημιουργείται όταν εκτελείται ένα σενάριο. Οι μόνες εντολές που λειτουργούν σε αυτό το εύρος είναι αυτές που υπάρχουν στο σενάριο.
  • ΙδιωτικόςΤα πεδία μπορούν να οριστούν εντός του τρέχοντος εύρους, για να αποτρέψουν εντολές σε άλλα πεδία από το να μπορούν να διαβάσουν ή να τροποποιήσουν στοιχεία στα οποία διαφορετικά θα μπορούσαν να έχουν πρόσβαση.

Τα πεδία μπορούν επίσης να αναφέρονται με αριθμό σε ορισμένες εντολές, όπου το τρέχον εύρος αναφέρεται ως μηδέν και οι πρόγονοί του αναφέρονται με αυξανόμενους ακέραιους αριθμούς. Για παράδειγμα, μέσα σε ένα σενάριο που εκτελείται από το Καθολικό εύρος, το εύρος σεναρίου θα είναι 0 και το Καθολικό εύρος θα είναι 1. Ένα εύρος που ήταν περαιτέρω ένθετο εντός του πεδίου δέσμης ενεργειών, όπως μια συνάρτηση, θα αναφέρεται στο Καθολικό εύρος ως 2 Ωστόσο, οι αρνητικοί αριθμοί δεν θα λειτουργήσουν ως αναφορά σε παιδικά πεδία – ο λόγος για αυτό θα φανεί σύντομα.



Πώς τα πεδία επηρεάζουν τις εντολές

Όπως αναφέρθηκε προηγουμένως, οι εντολές που εκτελούνται εντός ενός εύρους δεν θα επηρεάσουν τα πράγματα σε ένα άλλο εύρος, εκτός εάν τους ζητηθεί συγκεκριμένα να το κάνουν. Για παράδειγμα, εάν το $MyVar υπάρχει στο Καθολικό εύρος και ένα σενάριο εκτελεί μια εντολή για να ορίσει το $MyVar σε διαφορετική τιμή, η καθολική έκδοση του $MyVar θα παραμείνει αναλλοίωτη ενώ ένα αντίγραφο του $MyVar τοποθετείται στο εύρος δέσμης ενεργειών με το νέο αξία. Εάν ένα $MyVar δεν υπάρχει, ένα σενάριο θα το δημιουργήσει εντός του εύρους Σεναρίου από προεπιλογή – όχι στο Καθολικό εύρος. Αυτό είναι σημαντικό να το θυμάστε καθώς μαθαίνετε για την πραγματική σχέση γονέα/παιδιού μεταξύ των πεδίων.

Διαφήμιση

Η σχέση γονέα/παιδιού των πεδίων στο PowerShell είναι μονόδρομη. Οι εντολές μπορούν να δουν και προαιρετικά να τροποποιήσουν το τρέχον εύρος, τον γονικό του και τυχόν πεδία πάνω από αυτό. Ωστόσο, δεν μπορούν να δουν ή να τροποποιήσουν πράγματα σε κανένα παιδί της τρέχουσας εμβέλειας. Αυτό οφείλεται κυρίως στο ότι, μόλις μεταβείτε σε ένα γονικό πεδίο, το θυγατρικό πεδίο έχει ήδη καταστραφεί επειδή έχει εκπληρώσει τον σκοπό του. Για παράδειγμα, γιατί θα πρέπει να δείτε ή να τροποποιήσετε μια μεταβλητή στο πεδίο δέσμης ενεργειών, από το Καθολικό εύρος, μετά τον τερματισμό του σεναρίου; Υπάρχουν πολλές περιπτώσεις όπου χρειάζεστε οι αλλαγές ενός σεναρίου ή μιας συνάρτησης για να διατηρηθούν μετά την ολοκλήρωσή του, αλλά όχι τόσες όπου θα χρειαστεί να κάνετε αλλαγές σε αντικείμενα εντός του πεδίου του σεναρίου ή της λειτουργίας πριν ή μετά την εκτέλεσή του. (Συνήθως, τέτοια πράγματα θα αντιμετωπίζονται ως μέρος του σεναρίου ή της ίδιας της λειτουργίας ούτως ή άλλως.)

Φυσικά, τι είναι κανόνες χωρίς εξαιρέσεις; Μια εξαίρεση στα παραπάνω είναι τα ιδιωτικά πεδία. Τα αντικείμενα στα Ιδιωτικά πεδία είναι προσβάσιμα μόνο σε εντολές που εκτελούνται στο πεδίο από το οποίο δημιουργήθηκαν. Μια άλλη σημαντική εξαίρεση είναι τα στοιχεία που έχουν την ιδιότητα AllScope. Αυτές είναι ειδικές μεταβλητές και ψευδώνυμα για τα οποία μια αλλαγή σε οποιοδήποτε πεδίο θα επηρεάσει όλα τα πεδία. Οι ακόλουθες εντολές θα σας δείξουν ποιες μεταβλητές και ψευδώνυμα έχουν την ιδιότητα AllScope:



Get-Variable | Where-Object {$_.Options -match 'AllScope'} Get-Alias | Where-Object {$_.Options -match 'AllScope')

Πεδία σε Δράση

Για την πρώτη μας ματιά στα πεδία σε δράση, θα ξεκινήσουμε σε μια περίοδο λειτουργίας PowerShell όπου η μεταβλητή $MyVar έχει οριστεί σε μια συμβολοσειρά, «Είμαι μια καθολική μεταβλητή!», από τη γραμμή εντολών. Στη συνέχεια, το ακόλουθο σενάριο θα εκτελεστεί από ένα αρχείο που ονομάζεται Scope-Demo.ps1:

Function FunctionScope { 'Changing $MyVar with a function.' $MyVar = 'I got set by a function!' 'MyVar says $MyVar' } '' 'Checking current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' '' FunctionScope '' 'Checking final value of MyVar before script exit.' 'MyVar says $MyVar' ''

Εάν τα σενάρια PowerShell λειτουργούσαν το ίδιο με τα σενάρια δέσμης, θα περιμέναμε η τιμή του $MyVar (ή %MyVar% στη σύνταξη παρτίδας) να αλλάξει από 'Είμαι καθολική μεταβλητή!', σε 'Έχω οριστεί από ένα σενάριο!' , και τέλος στο 'Έχω οριστεί από μια συνάρτηση!' όπου θα παραμείνει μέχρι να αλλάξει ρητά ξανά ή να τερματιστεί η περίοδος λειτουργίας. Ωστόσο, δείτε τι συμβαίνει στην πραγματικότητα εδώ καθώς κινούμαστε σε καθένα από τα πεδία – ιδιαίτερα, αφού η συνάρτηση FunctionScope ολοκληρώσει την εργασία της και ελέγξουμε ξανά τη μεταβλητή από το Script και αργότερα το καθολικό εύρος.

Όπως μπορείτε να δείτε η μεταβλητή φαινόταν να αλλάζει καθώς προχωρούσαμε στο σενάριο, επειδή, μέχρι να ολοκληρωθεί η λειτουργία FunctionScope, ελέγχαμε τη μεταβλητή από το ίδιο εύρος που άλλαξε τελευταία. Ωστόσο, μετά την ολοκλήρωση του FunctionScope, επιστρέψαμε στο πεδίο Script όπου το $MyVar έμεινε ανέγγιχτο από τη συνάρτηση. Στη συνέχεια, όταν ολοκληρώθηκε το σενάριο, επιστρέψαμε στο Παγκόσμιο εύρος όπου δεν είχε τροποποιηθεί καθόλου.

Προσέγγιση εκτός του τοπικού πεδίου

Λοιπόν, όλα αυτά είναι καλά για να σας βοηθήσουν να μην εφαρμόσετε κατά λάθος αλλαγές στο περιβάλλον πέρα ​​από τα σενάρια και τις λειτουργίες σας, αλλά τι γίνεται αν θέλετε πραγματικά να κάνετε τέτοιες τροποποιήσεις; Υπάρχει μια ειδική, και αρκετά απλή, σύνταξη για τη δημιουργία και την τροποποίηση αντικειμένων πέρα ​​από το τοπικό πεδίο. Απλώς βάζετε το όνομα του εύρους στην αρχή του ονόματος της μεταβλητής και βάζετε άνω και κάτω τελεία ανάμεσα στο όνομα πεδίου και των μεταβλητών. Σαν αυτό:

$global:MyVar $script:MyVar $local:MyVar
Διαφήμιση

Μπορείτε να χρησιμοποιήσετε αυτούς τους τροποποιητές τόσο κατά την προβολή όσο και κατά τη ρύθμιση μεταβλητών. Ας δούμε τι συμβαίνει με αυτό το σενάριο επίδειξης:

Function FunctionScope { '' 'Changing $MyVar in the local function scope...' $local:MyVar = 'This is MyVar in the function's local scope.' 'Changing $MyVar in the script scope...' $script:MyVar = 'MyVar used to be set by a script. Now set by a function.' 'Changing $MyVar in the global scope...' $global:MyVar = 'MyVar was set in the global scope. Now set by a function.' '' 'Checking $MyVar in each scope...' 'Local: $local:MyVar' 'Script: $script:MyVar' 'Global: $global:MyVar' '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Όπως και πριν, θα ξεκινήσουμε ορίζοντας τη μεταβλητή στο Καθολικό εύρος και θα τελειώσουμε με τον έλεγχο του τελικού αποτελέσματος καθολικού εύρους.

Εδώ μπορείτε να δείτε ότι το FunctionScope μπόρεσε να αλλάξει τη μεταβλητή στο εύρος δέσμης ενεργειών και να επιμείνουν οι αλλαγές μετά την ολοκλήρωσή της. Επίσης, η αλλαγή στη μεταβλητή στο Καθολικό εύρος παρέμεινε ακόμη και μετά την έξοδο του σεναρίου. Αυτό μπορεί να είναι ιδιαίτερα χρήσιμο εάν πρέπει να αλλάξετε επανειλημμένα μεταβλητές μέσα σε ένα σενάριο ή εντός του καθολικού εύρους, χρησιμοποιώντας τον ίδιο κώδικα – απλώς ορίζετε μια συνάρτηση ή ένα σενάριο που είναι γραμμένο για να τροποποιήσετε τη μεταβλητή όπου και πώς χρειάζεται να γίνει και καλέστε το όποτε αυτές οι αλλαγές είναι απαραίτητες.

Όπως αναφέρθηκε προηγουμένως, οι αριθμοί εύρους μπορούν επίσης να χρησιμοποιηθούν σε ορισμένες εντολές για την τροποποίηση της μεταβλητής σε διαφορετικά επίπεδα σε σχέση με το Τοπικό εύρος. Ακολουθεί η ίδια δέσμη ενεργειών που χρησιμοποιήθηκε στο δεύτερο παράδειγμα παραπάνω, αλλά με τη συνάρτηση τροποποιημένη ώστε να χρησιμοποιεί τις εντολές Get-Variable και Set-Variable με αριθμούς εμβέλειας αντί για απευθείας αναφορά στη μεταβλητή με επώνυμα πεδία:

Function FunctionScope { '' 'Changing $MyVar in scope 0, relative to FunctionScope...' Set-Variable MyVar 'This is MyVar in the function's scope 0.' –Scope 0 'Changing $MyVar in scope 1, relative to FunctionScope...' Set-Variable MyVar 'MyVar was changed in scope 1, from a function.' –Scope 1 'Changing $MyVar in scope 2, relative to Functionscope...' Set-Variable MyVar 'MyVar was changed in scope 2, from a function.' –Scope 2 '' 'Checking $MyVar in each scope...' ‘Scope 0:’ Get-Variable MyVar –Scope 0 –ValueOnly ‘Scope 1:’ Get-Variable MyVar –Scope 1 –ValueOnly ‘Scope 2:’ Get-Variable MyVar –Scope 2 –ValueOnly '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Παρόμοια με πριν, μπορούμε να δούμε εδώ πώς οι εντολές σε ένα εύρος μπορούν να τροποποιήσουν αντικείμενα στο γονικό εύρος του.

Επιπλέον πληροφορίες

Υπάρχουν ακόμα πολύ περισσότερα που μπορούν να γίνουν με τα πεδία από όσα χωρούν σε αυτό το άρθρο. Τα πεδία επηρεάζουν περισσότερα από απλές μεταβλητές και υπάρχουν ακόμα περισσότερα που πρέπει να μάθουμε για τα ιδιωτικά πεδία και τις μεταβλητές AllScope. Για περισσότερες χρήσιμες πληροφορίες, μπορείτε να εκτελέσετε την ακόλουθη εντολή μέσα από το PowerShell:

Get-Help about_scopes

Το ίδιο αρχείο βοήθειας είναι επίσης διαθέσιμο στο TechNet .


Πίστωση εικόνας εύρους: spadassin στο openclipart

ΔΙΑΒΑΣΤΕ ΤΗ ΣΥΝΕΧΕΙΑ

Ενδιαφέροντα Άρθρα