If-Koubou

Bagaimana Scopes Mempengaruhi Skrip PowerShell

Bagaimana Scopes Mempengaruhi Skrip PowerShell (Bagaimana caranya)

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 bagaimana cara bekerja 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 dalam 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 di luar 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:

Dapatkan-Variabel | Di mana-Obyek $ _. Opsi -match 'AllScope' Get-Alias ​​| Di mana-Obyek $ _. Pilihan -match 'AllScope')

Scope in Action

Untuk tampilan pertama kami di ruang lingkup dalam tindakan, kita akan mulai dalam 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 'Mengubah $ MyVar dengan fungsi.' $ MyVar = 'Saya ditetapkan oleh suatu fungsi!' "MyVar mengatakan $ MyVar" "Memeriksa nilai $ MyVar saat ini. ' "MyVar mengatakan $ MyVar" "Mengubah $ MyVar oleh skrip." $ MyVar = 'Saya diatur oleh skrip!' "MyVar mengatakan $ MyVar" "FunctionScope" Memeriksa nilai akhir MyVar sebelum skrip keluar. ' "MyVar mengatakan $ 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 ke 'Saya ditetapkan oleh suatu fungsi!' di mana itu 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 yang 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: Skrip $ MyVar: MyVar $ lokal: MyVar

Anda dapat menggunakan pengubah ini baik saat melihat dan menetapkan 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 lokal fungsi. "' Mengubah $ MyVar dalam lingkup skrip ... '$ script: MyVar =' MyVar dulunya adalah diatur oleh skrip. Sekarang diatur oleh fungsi. "Mengubah $ MyVar dalam lingkup global ... '$ global: MyVar =' MyVar ditetapkan dalam lingkup global. Sekarang diatur oleh fungsi. "Memeriksa $ MyVar di setiap ruang lingkup ... '" Lokal: $ lokal: MyVar "" Script: $ script: MyVar "" Global: $ global: MyVar "" "Mendapatkan nilai $ MyVar saat ini.' "MyVar mengatakan $ MyVar" "Mengubah $ MyVar oleh skrip." $ MyVar = 'Saya diatur oleh skrip!' "MyVar mengatakan $ MyVar" FunctionScope 'Memeriksa $ MyVar dari cakupan skrip sebelum keluar.' "MyVar mengatakan $ 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 perlu menyelesaikannya, dan ingat 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:

Fungsi FunctionScope "Mengubah $ MyVar dalam ruang lingkup 0, relatif terhadap FunctionScope ... 'Set-Variable MyVar" Ini adalah MyVar dalam lingkup fungsi 0. "-Scope 0' Mengubah $ MyVar dalam ruang lingkup 1, relatif terhadap FunctionScope ... 'Set-Variable MyVar 'MyVar telah diubah dalam ruang lingkup 1, dari sebuah fungsi.' -Scope 1 'Mengubah $ MyVar dalam lingkup 2, relatif terhadap Functionscope ...' Set-Variable MyVar 'MyVar telah diubah dalam ruang lingkup 2, dari sebuah fungsi.' -Scope 2 "Memeriksa $ MyVar di setiap ruang lingkup ..." Cakupan 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Cakupan 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Cakupan 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" Mendapatkan nilai $ MyVar saat ini. ' "MyVar mengatakan $ MyVar" "Mengubah $ MyVar oleh skrip." $ MyVar = 'Saya diatur oleh skrip!' "MyVar mengatakan $ MyVar" FunctionScope 'Memeriksa $ MyVar dari cakupan skrip sebelum keluar.' "MyVar mengatakan $ MyVar" "

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

informasi tambahan

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

Dapatkan-Bantuan tentang_scopes

File bantuan yang sama juga tersedia di TechNet.

Cakupan kredit gambar: spadassin pada openclipart