Mengapa PowerShell ISE tidak mengisolasi variabel skrip ke cakupan skrip?


12

Di PowerShell, pelingkupan seharusnya menjaga objek (variabel, alias, fungsi, dll) dalam skrip agar tidak mempengaruhi lingkungan global. Tampaknya ini berfungsi dengan baik di baris perintah, tetapi tidak di ISE.

Berikut ini demonstrasi di konsol. Saya memeriksa untuk melihat yang $xtidak didefinisikan dalam lingkup global, menunjukkan isi ScopeTest.ps1dan kemudian menjalankannya, dan terakhir saya memeriksa untuk melihat apakah $xdidefinisikan kembali. Seperti yang diharapkan, $xhanya dibuat dan digunakan dalam lingkup skrip dan tidak bertahan dalam lingkungan global setelah skrip tersebut dihentikan.

masukkan deskripsi gambar di sini

Di ISE, ini tampaknya berfungsi jika skrip dipanggil menggunakan jendela konsol.

masukkan deskripsi gambar di sini

Namun, jika saya benar-benar menggunakan tombol "Run Script", atau F5, variabel dalam skrip akan tetap ada setelah selesai.

masukkan deskripsi gambar di sini

Ini dapat membuat skrip penulisan dan pemecahan masalah agak sulit, jika skrip mengasumsikan bahwa skrip tersebut akan dimulai dari lingkungan yang bersih (yaitu: Setiap variabel yang diatur dalam skrip seharusnya belum ada.). Mengapa ISE berperilaku seperti ini?

Jawaban untuk pertanyaan ini hanya sedikit menyentuh topik, menyebutkan "dot-sourcing", tapi saya berharap untuk mendapatkan penjelasan yang lebih menyeluruh di sini. Juga, jika ada dokumentasi mengapa skrip dijalankan berbeda di ISE daripada dari konsol, referensi akan lebih baik juga.

Jawaban:


9

Dalam contoh skrip Anda, Anda membuat variabel dan Anda tidak menghancurkannya di akhir skrip Anda. ISE membuat instance PowerShell langsung yang memuat dan menjalankan skrip saat Anda mengklik jalankan. Perbedaannya adalah shell terintegrasi dapat melanjutkan skrip. Ini sangat ideal untuk debugging lingkungan dan untuk membuat skrip saat Anda pergi. Dengan cara ini Anda tidak harus terus menjalankan skrip Anda (ada situasi di mana ini tidak ideal) untuk memastikan baris kode berikutnya berfungsi. Anda mengetiknya di shell, dan jika berhasil, Anda menambahkannya ke bagian skrip.

Perilaku ini mungkin paling baik dijelaskan di sini: http://technet.microsoft.com/en-us/library/dd819480.aspx

Kutipan yang relevan:

Semua panel di ISE selalu dalam cakupan yang sama.

Jika Anda tidak ingin variabel Anda tinggal di shell setelah skrip Anda selesai, Anda harus Remove-Variablemembuatnya.

Sebagai contoh:

Remove-Variable x

Anda dapat menambahkan contoh "bersih" dari powershell ke ISE dengan mengklik File-> New Powershell Tab


2

Dalam ISE Powershell pada dasarnya membuang skrip ke shell dan kemudian menjalankannya. Seolah-olah Anda mengetikkannya di shell, kemudian jalankan. Jadi variabel tersedia untuk sesi itu. Untuk melihat perbedaan lain, lihat pos MSDN ini .


Saya tidak melihat apa pun di pos tertaut yang membahas perilaku ini.
Iszi

0

jadi ISE dicakup sebagai Global. Kecuali Anda menghapus semua variabel yang dibuat saat bekerja di ISE, semua variabel akan tersedia setelah skrip berjalan. Ketika saya menggunakan ISE untuk membangun skrip saya, saya akan selalu menguji dengan konsol PowerShell yang berbeda terbuka. Ini memungkinkan saya untuk memastikan semuanya berfungsi seperti yang saya inginkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.