Bagaimana Scopes Mempengaruhi Skrip PowerShell

Daftar Isi:

Bagaimana Scopes Mempengaruhi Skrip PowerShell
Bagaimana Scopes Mempengaruhi Skrip PowerShell

Video: Bagaimana Scopes Mempengaruhi Skrip PowerShell

Video: Bagaimana Scopes Mempengaruhi Skrip PowerShell
Video: Google & Apple Digital Wellbeing Features - How to use them - YouTube 2024, April
Anonim
Dalam skrip batch, perubahan variabel lingkungan memiliki dampak global ke sesi saat ini secara default. Untuk PowerShell, kebalikannya adalah benar karena cakupan digunakan untuk mengisolasi modifikasi skrip. Di sini, kita akan menjelajahi bagaimana cakupan mempengaruhi skrip PowerShell dan cara kerjanya di dalam dan di sekitar mereka.
Dalam skrip batch, perubahan variabel lingkungan memiliki dampak global ke sesi saat ini secara default. Untuk PowerShell, kebalikannya adalah benar karena cakupan digunakan untuk mengisolasi modifikasi skrip. Di sini, kita akan menjelajahi bagaimana cakupan mempengaruhi skrip PowerShell dan cara kerjanya di dalam dan di sekitar mereka.

Apa itu Ruang Lingkup?

Di PowerShell, "lingkup" mengacu pada lingkungan saat ini di mana skrip atau perintah shell sedang beroperasi. Cakupan digunakan untuk melindungi objek tertentu di dalam lingkungan agar tidak dimodifikasi secara tidak sengaja oleh skrip atau fungsi. Khususnya, hal-hal berikut dilindungi dari modifikasi oleh perintah dijalankan dari ruang lingkup lain, kecuali ditentukan lain oleh parameter dalam perintah-perintah tersebut:

  • Variabel
  • Alias
  • Fungsi
  • PowerShell Drives (PSDrives)

Cakupan baru dibuat kapan pun Anda menjalankan skrip atau fungsi, atau saat Anda membuat sesi baru atau turunan PowerShell. Cakupan yang dibuat dengan menjalankan skrip dan fungsi memiliki hubungan "orang tua / anak" dengan ruang lingkup dari mana mereka dibuat. Ada beberapa cakupan yang memiliki arti khusus, dan dapat diakses dengan nama:

  • Itu Global ruang lingkup adalah lingkup yang dibuat ketika PowerShell dimulai. Ini termasuk variabel, alias, fungsi, dan PSDrives yang terintegrasi ke PowerShell serta yang dibuat oleh profil PowerShell Anda.
  • Itu Lokal ruang lingkup mengacu pada apa pun lingkup saat ini. Ketika Anda memulai PowerShell, itu akan merujuk ke lingkup Global, dalam skrip itu akan menjadi ruang lingkup Skrip, dll.
  • Itu Naskah ruang lingkup dibuat saat skrip dijalankan. Satu-satunya perintah yang beroperasi dalam ruang lingkup ini adalah yang ada dalam skrip.
  • Pribadi lingkup dapat didefinisikan dalam lingkup saat ini, untuk mencegah perintah di lingkup lain dari mampu membaca atau memodifikasi item yang mungkin mereka miliki.

Lingkup juga dapat disebut dengan nomor dalam perintah tertentu, di mana ruang lingkup saat ini disebut sebagai nol dan nenek moyangnya direferensikan dengan meningkatkan bilangan bulat. Misalnya, dalam skrip yang dijalankan dari lingkup Global, cakupan skrip akan menjadi 0 dan lingkup Global akan menjadi 1. Lingkup yang lebih bersarang dalam cakupan Skrip, seperti fungsi, akan mengacu pada lingkup Global sebagai 2 Angka negatif tidak akan berfungsi untuk mereferensikan ruang lingkup anak - alasannya akan segera terlihat.

Bagaimana Scopes Mempengaruhi Perintah

Seperti disebutkan sebelumnya, perintah yang dijalankan dalam satu ruang lingkup tidak akan mempengaruhi hal-hal di ruang lingkup lain kecuali secara khusus diperintahkan untuk melakukannya. Sebagai contoh, jika $ MyVar ada dalam lingkup Global dan skrip menjalankan perintah untuk mengatur $ MyVar ke nilai yang berbeda, versi global $ MyVar akan tetap tidak berubah sementara salinan $ MyVar ditempatkan di lingkup Skrip dengan yang baru nilai. Jika $ MyVar tidak ada, skrip akan membuatnya dalam lingkup Skrip secara default - tidak di lingkup Global. Ini penting untuk diingat ketika Anda mempelajari tentang hubungan orang tua / anak yang sebenarnya di antara cakupan.

Hubungan orangtua / anak lingkup di PowerShell adalah satu arah. Perintah dapat melihat ke dalam, dan opsional memodifikasi, lingkup saat ini, induknya, dan cakupan di atasnya. Namun, mereka tidak dapat melihat atau memodifikasi hal-hal di setiap anak dari lingkup saat ini. Ini terutama karena, setelah Anda pindah ke ruang lingkup orang tua, ruang lingkup anak telah dihancurkan karena telah memenuhi tujuannya. Misalnya, mengapa Anda harus melihat atau memodifikasi variabel dalam lingkup Skrip, dari lingkup Global, setelah skrip berhenti? Ada banyak kasus di mana Anda memerlukan perubahan skrip atau fungsi untuk bertahan setelah penyelesaiannya, tetapi tidak begitu banyak di mana Anda perlu melakukan perubahan pada objek dalam lingkup skrip atau fungsi sebelum atau setelah dijalankan. (Biasanya, hal-hal seperti itu akan ditangani sebagai bagian dari skrip atau berfungsi dengan sendirinya.)

Tentu saja, apa aturan tanpa pengecualian? Satu pengecualian di atas adalah lingkup Pribadi. Objek dalam lingkup Pribadi hanya dapat diakses oleh perintah yang dijalankan dalam lingkup dari mana mereka diciptakan. Pengecualian penting lainnya adalah item yang memiliki properti AllScope. Ini adalah variabel khusus dan alias yang perubahannya dalam lingkup apa pun akan memengaruhi semua cakupan. Perintah berikut akan menunjukkan kepada Anda variabel dan alias mana yang memiliki properti AllScope:

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

Scope in Action

Untuk tampilan pertama kami dalam lingkup tindakan, kami akan memulai sesi PowerShell di mana variabel $ MyVar telah ditetapkan ke string, 'Saya adalah variabel global!', Dari baris perintah. Kemudian, skrip berikut akan dijalankan dari file bernama 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' ''

Jika skrip PowerShell bekerja sama dengan skrip batch, kami mengharapkan vale $ MyVar (atau% MyVar% dalam sintaks batch) untuk berubah dari 'I am a global variable!', Menjadi 'I got set by script!', dan akhirnya untuk 'Saya ditetapkan oleh suatu fungsi!' di mana ia akan tetap sampai itu secara eksplisit berubah lagi atau sesi dihentikan. Namun, lihat apa yang sebenarnya terjadi di sini saat kita bergerak melalui masing-masing cakupan - terutama, setelah fungsi FunctionScope telah menyelesaikan tugasnya dan kami memeriksa variabel lagi dari Skrip, dan kemudian Global, cakupan.

Seperti yang Anda lihat, variabel itu berubah ketika kami memindahkan skrip karena, sampai fungsi FunctionScope selesai, kami memeriksa variabel dari dalam lingkup yang sama terakhir kali diubah. Setelah FunctionScope selesai, kami pindah kembali ke lingkup Skrip di mana $ MyVar tidak tersentuh oleh fungsi. Kemudian, ketika skrip dihentikan, kami kembali keluar ke lingkup Global di mana itu belum dimodifikasi sama sekali.
Seperti yang Anda lihat, variabel itu berubah ketika kami memindahkan skrip karena, sampai fungsi FunctionScope selesai, kami memeriksa variabel dari dalam lingkup yang sama terakhir kali diubah. Setelah FunctionScope selesai, kami pindah kembali ke lingkup Skrip di mana $ MyVar tidak tersentuh oleh fungsi. Kemudian, ketika skrip dihentikan, kami kembali keluar ke lingkup Global di mana itu belum dimodifikasi sama sekali.

Mencapai Luar Ruang Lingkup Lokal

Jadi, ini semua baik dan bagus untuk membantu Anda secara tidak sengaja menerapkan perubahan pada lingkungan di luar skrip dan fungsi Anda, tetapi bagaimana jika Anda benar-benar ingin melakukan modifikasi semacam itu? Ada sintaks khusus, dan cukup sederhana, untuk membuat dan memodifikasi objek di luar lingkup Lokal. Anda cukup meletakkan nama ruang lingkup di awal nama variabel, dan meletakkan titik dua di antara ruang lingkup dan nama variabel. Seperti ini:

$global:MyVar $script:MyVar $local:MyVar

Anda dapat menggunakan pengubah ini baik saat melihat dan menetapkan variabel. Mari kita lihat apa yang terjadi dengan skrip demonstrasi ini:

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' ''

Seperti sebelumnya, kita akan mulai dengan menetapkan variabel dalam lingkup Global dan diakhiri dengan memeriksa hasil lingkup Global akhir.

Di sini Anda dapat melihat bahwa FunctionScope dapat mengubah variabel dalam cakupan Skrip, dan perubahannya tetap ada setelah selesai. Juga, perubahan ke variabel dalam lingkup Global berlangsung bahkan setelah skrip telah keluar. Ini dapat sangat berguna jika Anda harus berulang kali mengubah variabel dalam skrip, atau dalam lingkup Global, menggunakan kode yang sama – Anda hanya mendefinisikan fungsi atau skrip yang ditulis untuk memodifikasi variabel di mana dan bagaimana Anda memerlukannya dilakukan, dan panggil itu setiap kali perubahan itu diperlukan.
Di sini Anda dapat melihat bahwa FunctionScope dapat mengubah variabel dalam cakupan Skrip, dan perubahannya tetap ada setelah selesai. Juga, perubahan ke variabel dalam lingkup Global berlangsung bahkan setelah skrip telah keluar. Ini dapat sangat berguna jika Anda harus berulang kali mengubah variabel dalam skrip, atau dalam lingkup Global, menggunakan kode yang sama – Anda hanya mendefinisikan fungsi atau skrip yang ditulis untuk memodifikasi variabel di mana dan bagaimana Anda memerlukannya dilakukan, dan panggil itu setiap kali perubahan itu diperlukan.

Seperti disebutkan sebelumnya, nomor lingkup juga dapat digunakan dalam perintah tertentu untuk memodifikasi variabel pada tingkat yang berbeda dalam kaitannya dengan lingkup Lokal. Berikut ini skrip yang sama yang digunakan dalam contoh kedua di atas, tetapi dengan fungsi yang dimodifikasi untuk menggunakan perintah Get-Variable dan Set-Variable dengan nomor lingkup alih-alih langsung mereferensikan variabel dengan lingkup bernama:

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' ''

Image
Image

Serupa dengan sebelumnya, kita dapat melihat di sini bagaimana perintah dalam satu ruang lingkup dapat memodifikasi objek dalam ruang lingkup induknya.

informasi tambahan

Masih ada banyak lagi yang bisa dilakukan dengan lingkup daripada yang bisa masuk dalam artikel ini. Cakupan mempengaruhi lebih dari sekedar variabel, dan masih ada yang harus dipelajari tentang cakupan Pribadi dan variabel AllScope. Untuk informasi yang lebih bermanfaat, Anda dapat menjalankan perintah berikut dari dalam PowerShell:

Get-Help about_scopes

File bantuan yang sama juga tersedia di TechNet.

Cakupan kredit gambar: spadassin pada openclipart

Direkomendasikan: