Bagaimana Skop mempengaruhi Skrip PowerShell
Dalam skrip batch, perubahan kepada pembolehubah persekitaran mempunyai kesan global ke sesi semasa secara lalai. Untuk PowerShell, yang bertentangan tepat adalah benar kerana skop digunakan untuk mengasingkan modifikasi skrip. Di sini, kami akan meneroka bagaimana skop menjejaskan skrip PowerShell dan bagaimana untuk bekerja di dalam dan di sekelilingnya.
Apa itu Skop?
Di PowerShell, "skop" merujuk kepada persekitaran semasa di mana skrip atau shell perintah beroperasi. Skop digunakan untuk melindungi objek tertentu dalam persekitaran daripada diubahsuai secara sengaja oleh skrip atau fungsi. Khususnya, perkara-perkara berikut dilindungi daripada pengubahsuaian oleh perintah yang dijalankan dari skop lain, melainkan dinyatakan sebaliknya oleh parameter dalam perintah tersebut:
- Pembolehubah
- Aliases
- Fungsi
- Pemacu PowerShell (PSDrives)
Skop baru dicipta apabila anda menjalankan skrip atau fungsi, atau apabila anda membuat sesi atau contoh baru PowerShell. Skop yang dibuat dengan skrip dan fungsi yang dijalankan mempunyai hubungan "ibu bapa / anak" dengan skop yang mereka buat. Terdapat beberapa skop yang mempunyai makna khas, dan boleh diakses dengan nama:
- The Global Ruang lingkup adalah skop yang dicipta apabila PowerShell bermula. Ia termasuk pembolehubah, alias, fungsi, dan PSDrives yang terbina dalam PowerShell serta apa-apa yang dibuat oleh profil PowerShell anda.
- The Tempatan Skop merujuk kepada apa sahaja skop semasa. Apabila anda memulakan PowerShell, ia akan merujuk kepada skop Global, dalam skrip ia akan skop Skrip, dan lain-lain.
- The Skrip skop dicipta apabila skrip dijalankan. Satu-satunya perintah yang beroperasi dalam skop ini adalah yang terdapat dalam skrip.
- Peribadi skop boleh ditakrifkan dalam skop semasa, untuk mengelakkan arahan dalam skop lain daripada dapat membaca atau mengubah suai perkara yang mungkin mempunyai akses kepada.
Skop juga boleh dirujuk dengan nombor dalam beberapa perintah tertentu, di mana skop semasa dirujuk sebagai sifar dan nenek moyangnya dirujuk dengan meningkatkan bilangan bulat. Sebagai contoh, dalam skrip yang dijalankan dari skop Global, skop Skrip akan menjadi 0 dan Skop Global akan menjadi 1. Skop yang lebih bersarang dalam skop Skrip, seperti fungsi, akan merujuk kepada Skop Global sebagai 2 Nombor negatif tidak akan berfungsi untuk merujuk skop kanak-kanak walaupun - sebab untuk ini akan kelihatan tidak lama lagi.
Bagaimana Skop Memengaruhi Perintah
Seperti yang dinyatakan sebelum ini, perintah yang dilaksanakan dalam satu skop tidak akan mempengaruhi perkara dalam skop lain melainkan diberitahu secara khusus untuk berbuat demikian. Sebagai contoh, jika $ MyVar wujud dalam skop Global dan skrip menjalankan arahan untuk menetapkan $ MyVar kepada nilai yang berbeza, versi Global $ MyVar akan kekal tidak berubah sementara salinan $ MyVar diletakkan dalam Skrip Skrip dengan yang baru nilai. Jika $ MyVar tidak wujud, skrip akan menciptanya dalam skop Skrip secara lalai - bukan dalam skop Global. Ini penting untuk diingati semasa anda belajar tentang hubungan ibu bapa / anak yang sebenar antara skop.
Hubungan antara ibu bapa dan anak dalam skop di PowerShell adalah satu arah. Perintah boleh melihat, dan mengubah suai, skop semasa, induknya, dan sebarang skop di atasnya. Walau bagaimanapun, mereka tidak dapat melihat atau mengubah suai perkara dalam mana-mana kanak-kanak skop semasa. Ini terutamanya kerana, sebaik sahaja anda memasuki skop induk, skop kanak-kanak telah musnah kerana ia telah memenuhi tujuannya. Sebagai contoh, mengapa anda perlu melihat atau mengubah suai pembolehubah dalam skop Skrip, dari skop Global, selepas skrip telah ditamatkan? Terdapat banyak kes di mana anda memerlukan perubahan skrip atau fungsi untuk bertahan di luar penyelesaiannya, tetapi tidak begitu banyak di mana anda perlu membuat perubahan pada objek dalam ruang skrip atau fungsi sebelum atau selepas ia dijalankan. (Biasanya perkara tersebut akan dikendalikan sebagai sebahagian daripada skrip atau berfungsi sendiri.)
Sudah tentu, apakah peraturan tanpa pengecualian? Satu pengecualian ke atas adalah skop Persendirian. Objek dalam skop Persendirian hanya boleh diakses oleh arahan yang dijalankan dalam skop di mana ia dicipta. Satu lagi pengecualian penting adalah item yang mempunyai harta AllScope. Ini adalah pemboleh ubah khas dan alias yang mana perubahan dalam sebarang skop akan mempengaruhi semua skop. Perintah berikut akan menunjukkan kepada anda pemboleh ubah dan alias mempunyai ciri AllScope:
Get-Variable | Di mana-Objek $ _. Pilihan -mencari 'AllScope' Get-Alias | Where-Object $ _. Options -match 'AllScope')
Skop dalam Tindakan
Untuk melihat pertama kami dalam skop dalam tindakan, kami akan memulakan sesi PowerShell di mana pembolehubah $ MyVar telah ditetapkan pada rentetan, 'Saya pembolehubah global!', Dari baris arahan. Kemudian skrip berikut akan dijalankan dari satu fail yang dipanggil Skop-Demo.ps1:
Function FunctionScope 'Mengubah $ MyVar dengan fungsi.' $ MyVar = 'Saya mendapat set fungsi!' "MyVar berkata $ MyVar" "Memeriksa nilai semasa $ MyVar. ' "MyVar berkata $ MyVar" "Menukar $ MyVar dengan skrip. ' $ MyVar = 'Saya mendapat set skrip!' "MyVar berkata $ MyVar" "FunctionScope" Memeriksa nilai akhir MyVar sebelum keluar script. ' "MyVar berkata $ MyVar" "
Sekiranya skrip PowerShell berfungsi sama seperti skrip batch, kita akan mengharapkan lembah $ MyVar (atau% MyVar% dalam sintaks batch) untuk berubah dari 'Saya pembolehubah global!', 'Saya mendapat set skrip!' , dan akhirnya kepada 'saya mendapat ditetapkan oleh fungsi!' di mana ia akan kekal sehingga ia ditukar secara eksplisit semula atau sesi ditamatkan. Walau bagaimanapun, lihat apa yang sebenarnya berlaku di sini semasa kita bergerak melalui setiap ruang lingkup - terutamanya, selepas fungsi FunctionScope telah menyelesaikan kerja dan kita semak semula pembolehubah dari Skrip, dan kemudian Skop Global.
Memandangkan anda dapat melihat pembolehubah kelihatan berubah apabila kami berpindah melalui skrip kerana, sehingga fungsi FunctionScope selesai, kami memeriksa pemboleh ubah dari dalam ruang lingkup yang sama ia terakhir berubah. Selepas FunctionScope dilakukan, kami kembali ke skrip Skrip dimana $ MyVar tidak disentuh oleh fungsi tersebut. Kemudian, apabila skrip ditamatkan, kami kembali ke skop Global di mana ia tidak diubahsuai sama sekali.
Mencapai Luar Skop Tempatan
Jadi, ini semua baik dan baik untuk membantu anda menyimpan secara tidak sengaja menerapkan perubahan kepada alam sekitar di luar skrip dan fungsi anda, tetapi bagaimana jika anda benar-benar mahu membuat pengubahsuaian sedemikian? Terdapat satu sintaks khas, dan cukup mudah, untuk membuat dan mengubah suai objek di luar ruang lingkup Tempatan. Anda hanya meletakkan nama skop pada permulaan nama pembolehubah, dan meletakkan kolon antara skop dan nama pemboleh ubah. Seperti ini:
$ global: MyVar $ script: MyVar $ local: MyVar
Anda boleh menggunakan pengubah ini semasa melihat dan menetapkan pembolehubah. Mari lihat apa yang berlaku dengan skrip demonstrasi ini:
Fungsi FunScope "Menukar $ MyVar dalam skop fungsi tempatan ... '$ local: MyVar =" Ini MyVar dalam skop tempatan fungsi.' 'Menukar $ MyVar dalam skop skrip ...' $ script: MyVar = 'MyVar dulu yang ditetapkan oleh skrip Sekarang ditetapkan oleh fungsi. "Mengubah $ MyVar dalam skop global ... '$ global: MyVar =' MyVar telah ditetapkan dalam skop global. Memeriksa $ MyVar dalam setiap skop ... '"Lokal: $ lokal: MyVar" "Skrip: skrip $: MyVar" "Global: $ global: MyVar" "" Mendapatkan nilai semasa $ MyVar.' "MyVar berkata $ MyVar" "Menukar $ MyVar dengan skrip. ' $ MyVar = 'Saya mendapat set skrip!' "MyVar berkata $ MyVar" FunctionScope 'Memeriksa $ MyVar dari skop skrip sebelum keluar.' "MyVar berkata $ MyVar" "
Seperti dahulu, kami akan mula dengan menetapkan pembolehubah dalam skop Global dan akhir dengan menyemak hasil skop Global terakhir.
Di sini anda dapat melihat bahawa FunctionScope dapat mengubah pembolehubah dalam skop Skrip, dan mempunyai perubahan yang berterusan setelah selesai. Juga, perubahan kepada pemboleh ubah dalam skop Global berterusan walaupun skrip telah keluar. Ini berguna terutamanya jika anda perlu berulang kali mengubah pembolehubah dalam skrip, atau dalam skop Global, menggunakan kod yang sama - anda hanya menentukan fungsi atau skrip yang ditulis untuk mengubah suai pembolehubah di mana dan bagaimana anda memerlukannya, dan panggil bahawa setiap kali perubahan tersebut diperlukan.
Seperti yang disebutkan sebelumnya, nombor skop juga boleh digunakan dalam perintah tertentu untuk mengubah suai pemboleh ubah pada tahap yang berbeza berkaitan dengan skop Tempatan. Inilah skrip yang sama yang digunakan dalam contoh kedua di atas, tetapi dengan fungsi yang diubah suai untuk menggunakan perintah Get-Variable dan Set-Variable dengan nombor skop dan bukannya secara langsung merujuk pembolehubah dengan skop yang dinamakan:
Fungsi FunScope "Menukar $ MyVar dalam skop 0, berbanding FunctionScope ... 'Set-Variable MyVar" Ini adalah MyVar dalam skop fungsi 0. "-Scope 0' Menukar $ MyVar dalam skop 1, berbanding FunctionScope ... 'Set-Variable MyVar 'MyVar telah diubah dalam skop 1, dari satu fungsi.' -Scope 1 'Menukar $ MyVar dalam skop 2, berbanding Functionscope ...' Set-Variable MyVar 'MyVar telah diubah dalam skop 2, dari fungsi.' -Scope 2 "Memeriksa $ MyVar dalam setiap skop ..." Skop 0: 'Dapatkan-Variable MyVar -Scope 0 -ValueOnly' Skop 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Skop 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" Mendapatkan nilai semasa $ MyVar. ' "MyVar berkata $ MyVar" "Menukar $ MyVar dengan skrip. ' $ MyVar = 'Saya mendapat set skrip!' "MyVar berkata $ MyVar" FunctionScope 'Memeriksa $ MyVar dari skop skrip sebelum keluar.' "MyVar berkata $ MyVar" "
Sama seperti sebelum ini, kita dapat lihat di sini bagaimana arahan dalam satu skop boleh mengubah suai objek dalam skop induknya.
Maklumat tambahan
Masih banyak lagi yang boleh dilakukan dengan skop daripada yang boleh dimuat dalam artikel ini. Skop menjejaskan lebih daripada sekadar pembolehubah, dan masih banyak lagi yang perlu dipelajari mengenai skop Persendirian dan pembolehubah AllScope. Untuk maklumat yang lebih berguna, anda boleh menjalankan arahan berikut dari dalam PowerShell:
Get-Help about_scopes
Fail bantuan yang sama juga tersedia di TechNet.
Skop imej kredit: spadassin pada openclipart