Bagaimana Lingkup Mempengaruhi Script PowerShell
Dalam skrip batch, perubahan pada 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 mengeksplorasi bagaimana ruang lingkup mempengaruhi skrip PowerShell dan cara bekerja di dalam dan di sekitarnya.
Apa itu Lingkup??
Di PowerShell, "lingkup" mengacu pada lingkungan saat ini di mana skrip atau perintah shell beroperasi. Lingkup digunakan untuk melindungi objek tertentu dalam lingkungan agar tidak sengaja dimodifikasi oleh skrip atau fungsi. Khususnya, hal-hal berikut dilindungi dari modifikasi oleh perintah yang dijalankan dari cakupan lain, kecuali ditentukan lain oleh parameter dalam perintah tersebut:
- Variabel
- Alias
- Fungsi
- PowerShell Drives (PSDrives)
Lingkup baru dibuat setiap kali Anda menjalankan skrip atau fungsi, atau ketika Anda membuat sesi baru atau contoh PowerShell. Lingkup yang dibuat dengan menjalankan skrip dan fungsi memiliki hubungan "orang tua / anak" dengan ruang lingkup dari mana mereka dibuat. Ada beberapa ruang lingkup yang memiliki makna khusus, dan dapat diakses dengan nama:
- Itu Global ruang lingkup adalah ruang lingkup yang dibuat saat PowerShell dimulai. Ini termasuk variabel, alias, fungsi, dan PSDrives yang terintegrasi ke PowerShell serta apa pun yang dibuat oleh profil PowerShell Anda.
- Itu Lokal ruang lingkup mengacu pada apa pun ruang lingkup saat ini. Ketika Anda memulai PowerShell itu akan merujuk ke lingkup Global, dalam skrip itu akan menjadi ruang lingkup Script, dll.
- Itu Naskah ruang lingkup dibuat ketika skrip dijalankan. Satu-satunya perintah yang beroperasi dalam lingkup ini adalah yang ada di skrip.
- Pribadi ruang lingkup dapat didefinisikan dalam ruang lingkup saat ini, untuk mencegah perintah di ruang lingkup lain agar tidak dapat membaca atau memodifikasi item yang mungkin memiliki akses ke.
Lingkup juga bisa disebut dengan angka dalam perintah tertentu, di mana cakupan saat ini disebut sebagai nol dan leluhurnya dirujuk dengan meningkatkan bilangan bulat. Misalnya, dalam skrip yang dijalankan dari lingkup Global, skrip lingkup akan menjadi 0 dan lingkup global akan menjadi 1. Cakupan yang selanjutnya disarangkan dalam lingkup Skrip, seperti fungsi, akan merujuk ke lingkup Global sebagai 2 Angka negatif tidak akan berfungsi untuk referensi lingkup anak - alasan untuk ini akan segera terlihat.
Bagaimana Lingkup Mempengaruhi Perintah
Seperti yang disebutkan sebelumnya, perintah yang dieksekusi dalam satu lingkup tidak akan mempengaruhi hal-hal dalam lingkup lain kecuali secara khusus disuruh melakukannya. Misalnya, jika $ MyVar ada di 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 - bukan dalam lingkup Global. Ini penting untuk diingat ketika Anda belajar tentang hubungan orangtua / anak yang sebenarnya di antara lingkup.
Hubungan induk / anak dari cakupan di PowerShell adalah satu arah. Perintah dapat melihat ke dalam, dan secara opsional memodifikasi, lingkup saat ini, induknya, dan semua lingkup di atasnya. Namun, mereka tidak dapat melihat atau memodifikasi hal-hal pada anak-anak dari ruang lingkup saat ini. Ini terutama karena, begitu Anda pindah ke ruang lingkup orang tua, ruang lingkup anak sudah dihancurkan karena telah memenuhi tujuannya. Misalnya, mengapa Anda harus melihat atau memodifikasi variabel dalam cakupan Skrip, dari cakupan Global, setelah skrip dihentikan? Ada banyak kasus di mana Anda membutuhkan perubahan skrip atau fungsi untuk bertahan di luar penyelesaiannya, tetapi tidak begitu banyak di mana Anda harus membuat perubahan pada objek dalam skrip atau fungsi fungsi sebelum atau setelah dijalankan. (Biasanya, hal-hal seperti itu akan ditangani sebagai bagian dari skrip atau fungsi itu sendiri.)
Tentu saja, apa aturan tanpa pengecualian? Satu pengecualian untuk yang di atas adalah Lingkup pribadi. Objek dalam lingkup Privat hanya dapat diakses oleh perintah yang dijalankan dalam ruang lingkup dari mana mereka dibuat. Pengecualian penting lainnya adalah item yang memiliki properti AllScope. Ini adalah variabel khusus dan alias yang perubahan dalam cakupan apa pun akan memengaruhi semua cakupan. Perintah berikut ini akan menunjukkan kepada Anda variabel dan alias mana yang memiliki properti AllScope:
Dapatkan-Variabel | Where-Object $ _. Opsi -match 'AllScope' Get-Alias | Where-Object $ _. Opsi -match 'AllScope')
Lingkup Beraksi
Untuk tampilan pertama kami di lingkup dalam aksi, kita akan mulai dalam sesi PowerShell di mana variabel $ MyVar telah diatur ke string, 'Saya adalah variabel global!', Dari baris perintah. Kemudian, skrip berikut akan dijalankan dari file bernama Scope-Demo.ps1:
Function FunctionScope 'Mengubah $ MyVar dengan suatu fungsi.' $ MyVar = 'Saya diset oleh fungsi!' "MyVar mengatakan $ MyVar" "Memeriksa nilai saat ini dari $ MyVar. ' "MyVar mengatakan $ MyVar" "Mengubah $ MyVar dengan skrip. ' $ MyVar = 'Saya mendapatkan script!' "MyVar mengatakan $ MyVar" "FunctionScope" Memeriksa nilai akhir MyVar sebelum skrip keluar. ' "MyVar mengatakan $ MyVar" "
Jika skrip PowerShell bekerja sama dengan skrip batch, kami berharap vale $ MyVar (atau% MyVar% dalam sintaks batch) berubah dari 'Saya adalah variabel global!', Ke 'Saya ditetapkan oleh skrip!' , dan akhirnya menjadi 'Saya diatur oleh suatu fungsi!' di mana ia akan tinggal sampai secara eksplisit diubah lagi atau sesi diakhiri. Namun, lihat apa yang sebenarnya terjadi di sini saat kami bergerak di setiap lingkup - khususnya, setelah fungsi FunctionScope menyelesaikan tugasnya dan kami memeriksa variabel lagi dari Script, dan kemudian Global, lingkup.
Seperti yang Anda lihat, variabel tampak berubah saat kami menelusuri skrip karena, hingga fungsi FunctionScope selesai, kami memeriksa variabel dari dalam cakupan yang sama dengan yang terakhir diubah. Setelah FunctionScope selesai, kami pindah kembali ke ruang lingkup Script di mana $ MyVar tidak tersentuh oleh fungsi. Kemudian, ketika skrip berakhir, kami kembali ke lingkup Global di mana itu tidak dimodifikasi sama sekali.
Mencapai Luar Lingkup Lokal
Jadi, ini semua baik dan bagus untuk membantu Anda mencegah perubahan yang tidak disengaja pada lingkungan di luar skrip dan fungsi Anda, tetapi bagaimana jika Anda benar-benar ingin melakukan modifikasi seperti itu? Ada sintaksis khusus, dan cukup sederhana, untuk membuat dan memodifikasi objek di luar cakupan Local. Anda cukup meletakkan nama lingkup di awal nama variabel, dan meletakkan tanda titik dua di antara ruang lingkup dan nama variabel. Seperti ini:
$ global: MyVar $ script: MyVar $ local: MyVar
Anda dapat menggunakan pengubah ini saat melihat dan mengatur variabel. Mari kita lihat apa yang terjadi dengan skrip demonstrasi ini:
Function FunctionScope "Mengubah $ MyVar dalam lingkup fungsi lokal ... '$ local: MyVar =" Ini adalah MyVar dalam lingkup fungsi lokal. "' Mengubah $ MyVar dalam lingkup skrip ... '$ script: MyVar =' MyVar dulu ditetapkan oleh skrip. Sekarang ditetapkan oleh fungsi. "Mengubah $ MyVar dalam lingkup global ... '$ global: MyVar =' MyVar ditetapkan dalam cakupan global. Sekarang disetel oleh fungsi. "Memeriksa $ MyVar di setiap cakupan ... '" Lokal: $ local: MyVar "" Script: $ script: MyVar "" Global: $ global: MyVar "" "Mendapatkan nilai $ MyVar saat ini.' "MyVar mengatakan $ MyVar" "Mengubah $ MyVar dengan skrip. ' $ MyVar = 'Saya mendapatkan script!' "MyVar mengatakan $ MyVar" FunctionScope 'Memeriksa $ MyVar dari cakupan skrip sebelum keluar.' "MyVar mengatakan $ MyVar" "
Seperti sebelumnya, kita akan mulai dengan mengatur variabel dalam lingkup Global dan mengakhiri dengan memeriksa hasil akhir lingkup Global.
Di sini Anda dapat melihat bahwa FunctionScope mampu mengubah variabel dalam lingkup Script, dan membuat perubahan tetap ada setelah selesai. Juga, perubahan ke variabel dalam lingkup Global bertahan bahkan setelah skrip telah keluar. Ini bisa sangat berguna karena 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, dan panggilan itu setiap kali perubahan itu diperlukan.
Seperti yang disebutkan sebelumnya, nomor lingkup juga dapat digunakan dalam perintah tertentu untuk memodifikasi variabel di berbagai tingkat sehubungan dengan cakupan lokal. Berikut ini skrip yang sama yang digunakan pada contoh kedua di atas, tetapi dengan fungsi yang dimodifikasi untuk menggunakan perintah Get-Variable dan Set-Variable dengan angka cakupan alih-alih langsung merujuk variabel dengan cakupan bernama:
Function FunctionScope "Mengubah $ MyVar dalam lingkup 0, relatif terhadap FunctionScope ... 'Set-Variable MyVar" Ini adalah MyVar dalam lingkup fungsi 0. "-Scope 0' Mengubah $ MyVar dalam lingkup 1, relatif terhadap FunctionScope ... 'Set-Variable MyVar 'MyVar diubah dalam lingkup 1, dari suatu fungsi.' -Scope 1 'Mengubah $ MyVar dalam lingkup 2, relatif terhadap Functionscope ...' Set-Variable MyVar 'MyVar diubah dalam lingkup 2, dari suatu fungsi.' -Scope 2 "Memeriksa $ MyVar di setiap ruang lingkup ..." Lingkup 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Scope 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Scope 2: 'Get-Variable MyVar -Scope 2 -Nilai Hanya "" Mendapatkan nilai $ MyVar saat ini. ' "MyVar mengatakan $ MyVar" "Mengubah $ MyVar dengan skrip. ' $ MyVar = 'Saya mendapatkan script!' "MyVar mengatakan $ MyVar" FunctionScope 'Memeriksa $ MyVar dari cakupan skrip sebelum keluar.' "MyVar mengatakan $ MyVar" "
Mirip dengan sebelumnya, kita dapat melihat di sini bagaimana perintah dalam satu lingkup dapat memodifikasi objek dalam lingkup induknya.
informasi tambahan
Masih banyak yang bisa dilakukan dengan cakupan daripada yang bisa ditampung dalam artikel ini. Lingkup memengaruhi lebih dari sekadar variabel, dan masih banyak yang harus dipelajari tentang lingkup Pribadi dan variabel AllScope. Untuk informasi lebih bermanfaat, Anda dapat menjalankan perintah berikut dari dalam PowerShell:
Dapatkan-Bantuan about_scopes
File bantuan yang sama juga tersedia di TechNet.
Kredit gambar lingkup: spadassin pada openclipart