Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Deskripsi singkat
Menjelaskan konsep cakupan di PowerShell dan menunjukkan cara mengatur dan mengubah cakupan elemen.
Deskripsi panjang
PowerShell melindungi akses ke variabel, alias, fungsi, dan drive PowerShell (PSDrives) dengan membatasi tempat mereka dapat dibaca dan diubah. PowerShell menggunakan aturan cakupan untuk memastikan bahwa Anda tidak membuat perubahan yang tidak disengaja pada item dalam cakupan lain.
Aturan cakupan
Saat Anda memulai PowerShell, host (pwsh.exe) membuat runspace PowerShell.
Proses host dapat memiliki beberapa runspace. Setiap runspace memiliki status sesi dan kontainer cakupannya sendiri. Status sesi dan cakupan tidak dapat diakses di seluruh instans runspace.
Berikut ini adalah aturan dasar cakupan:
- Lingkup dapat bersarang. Cakupan luar disebut sebagai cakupan induk. Cakupan berlapis apa pun adalah cakupan anak dari induk tersebut.
- Item terlihat dalam cakupan di mana item itu dibuat dan dalam cakupan anak mana pun, kecuali jika Anda menjadikannya privat secara eksplisit.
- Dengan menggunakan pengubah cakupan, Anda dapat mendeklarasikan variabel, alias, fungsi, dan drive PowerShell untuk cakupan di luar cakupan saat ini.
- Item yang Anda buat dalam cakupan hanya dapat diubah dalam cakupan tempat item dibuat, kecuali Anda secara eksplisit menentukan cakupan yang berbeda.
- Saat kode yang berjalan di runspace mereferensikan item, PowerShell mencari hierarki cakupan, dimulai dengan cakupan saat ini dan melanjutkan melalui setiap cakupan induk.
- Jika item tidak ditemukan, item baru dibuat dalam cakupan saat ini.
- Jika menemukan kecocokan, nilai item diambil dari cakupan di mana ditemukan.
- Jika Anda mengubah nilai, item disalin ke cakupan saat ini sehingga perubahan hanya memengaruhi cakupan saat ini.
- Jika Anda secara eksplisit membuat item yang membagikan namanya dengan item dalam cakupan yang berbeda, item asli mungkin disembunyikan oleh item baru, tetapi tidak ditimpa atau diubah.
Cakupan induk dan anak
Anda dapat membuat ruang lingkup anak baru dengan memanggil skrip atau fungsi. Cakupan panggilan adalah cakupan induk. Skrip atau fungsi yang disebut adalah cakupan anak. Fungsi atau skrip yang Anda panggil dapat memanggil fungsi lain, membuat hierarki cakupan anak yang cakupan akarnya adalah cakupan global.
Nota
Fungsi dari modul tidak dijalankan di dalam sub-ruang lingkup dari ruang lingkup pemanggilan. Modul memiliki status sesi masing-masing yang ditautkan ke ruang lingkup tempat modul diimpor. Semua kode modul berjalan dalam hierarki cakupan khusus modul yang memiliki cakupan akarnya sendiri. Untuk informasi selengkapnya, lihat bagian Modul di artikel ini.
Saat cakupan turunan dibuat, cakupan tersebut mencakup semua alias dan variabel yang memiliki opsi AllScope, dan beberapa variabel otomatis. Opsi ini dibahas nanti di artikel ini.
Kecuali Anda secara eksplisit membuat item menjadi privat, item dalam cakupan induk tersedia untuk cakupan anak. Item yang Anda buat atau ubah dalam cakupan anak tidak memengaruhi cakupan induk, kecuali Anda secara eksplisit menentukan cakupan saat membuat item.
Untuk menemukan item dalam cakupan tertentu, gunakan parameter Cakupan Get-Variable atau Get-Alias.
Misalnya, untuk mendapatkan semua variabel dalam cakupan lokal, ketik:
Get-Variable -Scope Local
Untuk mendapatkan semua variabel dalam cakupan global, ketik:
Get-Variable -Scope Global
Saat referensi dibuat ke variabel, alias, atau fungsi, PowerShell mencari cakupan saat ini. Jika item tidak ditemukan, pencarian dilanjutkan ke cakupan induk. Pencarian ini diulang hingga cakupan global. Jika variabel bersifat privat dalam cakupan induk, pencarian dilanjutkan melalui rantai cakupan. Contoh 4 menunjukkan efek variabel privat dalam pencarian cakupan.
Nama cakupan PowerShell
PowerShell menentukan nama untuk beberapa cakupan untuk memungkinkan akses yang lebih mudah ke cakupan tersebut. PowerShell menentukan cakupan bernama berikut:
- Global: Cakupan yang berlaku saat PowerShell dimulai atau saat Anda membuat sesi atau runspace baru. Variabel dan fungsi yang ada saat PowerShell dimulai, seperti variabel otomatis dan variabel preferensi, dibuat dalam cakupan global. Variabel, alias, dan fungsi di profil PowerShell Anda juga dibuat dalam cakupan global. Cakupan global adalah cakupan induk utama dalam ruang kerja (runspace).
- Lokal : Cakupan saat ini. Cakupan lokal dapat menjadi cakupan global atau cakupan lainnya.
- Skrip: Cakupan yang dibuat saat file skrip berjalan. Perintah dalam skrip berjalan dalam cakupan skrip. Untuk perintah dalam skrip, cakupan skrip adalah cakupan lokal.
Untuk cmdlet yang mendukung cakupan, cakupan dapat dirujuk oleh angka yang menjelaskan posisi relatif satu cakupan ke cakupan lainnya. Cakupan 0 menunjukkan cakupan saat ini (lokal), cakupan 1 adalah induk cakupan saat ini, cakupan 2 adalah kakek-nenek cakupan saat ini. Pola ini berlanjut sampai Anda mencapai lingkup utama.
Pengubah cakupan
Variabel, alias, atau nama fungsi dapat menyertakan salah satu pengubah cakupan opsional berikut:
Global:- Menentukan bahwa nama ada dalam lingkup Global .Local:- Menentukan bahwa nama ada di cakupan lokal. Cakupan saat ini selalu merupakan cakupan lokal. Saat Anda menggunakan pengubahLocal:cakupan, PowerShell tidak mencari cakupan induk. Jika item ada dalam cakupan saat ini, item akan digunakan. Jika item tidak ada dalam cakupan saat ini, PowerShell akan membuat item baru dalam cakupan saat ini.Private:- Menentukan bahwa nama tersebut Privat dan hanya dapat dilihat dalam cakupan saat ini.Script:- Menentukan bahwa nama ada dalam cakupan Skrip. cakupan Skrip adalah cakupan file skrip leluhur terdekat atau Global jika tidak ada file skrip leluhur terdekat.Using:- Digunakan untuk mengakses variabel yang ditentukan dalam cakupan lain saat menjalankan sesi jarak jauh, pekerjaan latar belakang, atau pekerjaan utas.Workflow:- Menentukan bahwa nama ada dalam alur kerja. Catatan: Alur kerja tidak didukung di PowerShell v6 dan yang lebih tinggi.<variable-namespace>- Pengubah yang dibuat oleh penyedia PowerShell PSDrive. Misalnya:Namespace Deskripsi Alias:Alias yang ditentukan dalam cakupan saat ini Env:Variabel lingkungan yang ditentukan dalam cakupan saat ini Function:Fungsi yang ditentukan dalam cakupan saat ini Variable:Variabel yang ditentukan dalam cakupan saat ini
Cakupan standar untuk skrip adalah cakupan skrip. Cakupan default untuk fungsi dan alias adalah cakupan lokal, bahkan jika didefinisikan dalam skrip.
Menggunakan pengubah cakupan
Untuk menentukan cakupan variabel, alias, atau fungsi baru, gunakan pengubah cakupan.
Sintaks untuk pengubah cakupan dalam variabel adalah:
$[<scope-modifier>:]<name> = <value>
Sintaks untuk pengubah cakupan dalam fungsi adalah:
function [<scope-modifier>:]<name> {<function-body>}
Perintah berikut, yang tidak menggunakan pengubah cakupan, membuat variabel dalam cakupan lokal saat ini atau .
$a = "one"
Untuk membuat variabel yang sama dalam cakupan global, gunakan pengubah Global: cakupan:
$Global:a = "one"
Get-Variable a | Format-List *
Perhatikan nilai properti Visibilitas dan Opsi.
Name : a
Description :
Value : one
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
Bandingkan dengan variabel privat:
$Private:pVar = 'Private variable'
Get-Variable pVar | Format-List *
Menggunakan pengubah cakupan Private: mengatur properti Opsi ke Private.
Name : pVar
Description :
Value : Private variable
Visibility : Public
Module :
ModuleName :
Options : Private
Attributes : {}
Untuk membuat variabel yang sama dalam cakupan skrip, gunakan pengubah cakupan Script::
$Script:a = "one"
Anda juga dapat menggunakan pengubah cakupan dengan fungsi. Definisi fungsi berikut membuat fungsi dalam ruang lingkup global:
function Global:Hello {
Write-Host "Hello, World"
}
Anda juga dapat menggunakan pengubah cakupan untuk merujuk ke variabel dalam cakupan yang berbeda.
Perintah berikut mengacu pada variabel $test, pertama dalam cakupan lokal lalu dalam cakupan global:
$test
$Global:test
Pengubah cakupan Using:
"Using adalah pengubah cakupan khusus yang mengidentifikasi variabel lokal dalam perintah jarak jauh." Tanpa pengubah, PowerShell mengharapkan variabel dalam perintah jarak jauh ditentukan dalam sesi jarak jauh.
Pengubah cakupan Using: diperkenalkan di PowerShell 3.0.
Untuk skrip atau perintah apa pun yang dijalankan diluar konteks sesi, Anda memerlukan pengubah cakupan Using: untuk menyematkan nilai variabel dari cakupan sesi panggilan, sehingga kode di luar sesi dapat mengaksesnya. Pengubah cakupan Using: didukung dalam konteks berikut:
- Perintah yang dijalankan dari jarak jauh, dimulai dengan
Invoke-Commandmenggunakan parameter ComputerName, HostName, SSHConnection atau Session (sesi jarak jauh) - Tugas latar belakang, dimulai dengan kode
Start-Job(sesi di luar proses) - Pekerjaan thread, dimulai melalui
Start-ThreadJobatauForEach-Object -Parallel(sesi thread terpisah)
Bergantung pada konteksnya, nilai variabel yang disematkan adalah salinan independen dari data dalam cakupan pemanggil atau referensi ke data tersebut. Dalam sesi jarak jauh dan di luar proses, mereka selalu salinan independen.
Untuk informasi selengkapnya, lihat about_Remote_Variables.
Referensi $Using: hanya meluas ke nilai variabel. Jika Anda ingin mengubah nilai variabel dalam cakupan pemanggil, Anda harus memiliki referensi ke variabel itu sendiri. Anda dapat membuat referensi ke variabel dengan mengambil instans PSVariable dari variabel. Contoh berikut menunjukkan cara membuat referensi dan melakukan perubahan dalam tugas utas.
$Count = 1
$refOfCount = Get-Variable Count
Start-ThreadJob {
($Using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob
$Count
2
Nota
Ini bukan operasi aman utas. Anda dapat menyebabkan kerusakan data jika mencoba mengubah nilai dari beberapa utas secara bersamaan. Anda harus menggunakan tipe data aman-thread atau primitif sinkronisasi untuk melindungi data bersama. Untuk informasi selengkapnya, lihat koleksi Thread-Safe.
Serialisasi nilai variabel
Perintah yang dijalankan dari jarak jauh dan pekerjaan latar belakang berjalan di luar proses. Sesi di luar proses menggunakan serialisasi dan deserialisasi berbasis XML untuk membuat nilai variabel tersedia di seluruh batas proses. Proses serialisasi mengonversi objek ke PSObject yang berisi properti objek asli tetapi bukan metodenya.
Untuk sekumpulan jenis terbatas, deserialisasi merehidrasi objek kembali ke jenis aslinya. Objek yang direhidrasi adalah salinan dari objek asli. Ini memiliki properti dan metode jenis. Untuk jenis sederhana, seperti System.Version, salinannya tepat. Untuk jenis kompleks, penyalinannya tidak sempurna. Misalnya, objek sertifikat yang direhidrasi tidak menyertakan kunci privat.
Instans dari semua jenis lainnya instans PSObject. Properti pstypenames berisi nama jenis asli yang diawali dengan Deserialized, misalnya, Deserialized.System.Data.DataTable
Opsi AllScope
Variabel dan alias memiliki properti Opsi yang dapat mengambil nilai AllScope. Item yang memiliki properti AllScope menjadi bagian dari cakupan turunan apa pun yang Anda buat, meskipun tidak diwarisi secara retroaktif oleh cakupan induk.
Item yang memiliki properti AllScope terlihat dalam cakupan turunan, dan adalah bagian dari cakupan tersebut. Perubahan pada item dalam cakupan apa pun memengaruhi semua cakupan di mana variabel ditentukan.
Mengelola ruang lingkup
Beberapa cmdlet memiliki parameter Cakupan yang memungkinkan Anda untuk mendapatkan atau mengatur (membuat dan mengubah) item dalam cakupan tertentu. Gunakan perintah berikut untuk menemukan semua cmdlet dalam sesi Anda yang memiliki parameter Cakupan:
Get-Help * -Parameter Scope
Untuk menemukan variabel yang terlihat dalam cakupan tertentu, gunakan parameter ScopeGet-Variable. Variabel yang terlihat termasuk variabel global, variabel dalam cakupan induk, dan variabel dalam cakupan saat ini.
Misalnya, perintah berikut mendapatkan variabel yang terlihat dalam cakupan lokal:
Get-Variable -Scope Local
Untuk membuat variabel dalam cakupan tertentu, gunakan pengubah cakupan atau parameter Scope dari Set-Variable. Perintah berikut membuat variabel dalam cakupan global:
New-Variable -Scope Global -Name a -Value "One"
Anda juga dapat menggunakan parameter Cakupan cmdlet New-Alias, Set-Alias, atau Get-Alias untuk menentukan cakupan. Perintah berikut membuat alias dalam cakupan global:
New-Alias -Scope Global -Name np -Value Notepad.exe
Untuk mendapatkan fungsi dalam cakupan tertentu, gunakan cmdlet Get-Item saat Anda berada dalam cakupan. Cmdlet Get-Item tidak memiliki parameter Cakupan .
Nota
Untuk cmdlet yang menggunakan parameter Cakupan, Anda juga dapat merujuk ke cakupan menurut nomor. Angka tersebut menjelaskan posisi relatif satu cakupan ke cakupan lainnya. Cakupan 0 mewakili cakupan saat ini, atau lokal. Cakupan 1 menunjukkan cakupan induk yang terdekat. Cakupan 2 menunjukkan induk dari induk cakupan, dan seterusnya. Cakupan bernomor berguna jika Anda telah membuat banyak cakupan rekursif.
Menggunakan notasi sumber titik dengan cakupan
Skrip dan fungsi mengikuti aturan cakupan. Anda membuatnya dalam cakupan tertentu, dan hanya memengaruhi cakupan tersebut kecuali Anda menggunakan parameter cmdlet atau pengubah cakupan untuk mengubah cakupan tersebut.
Namun, Anda dapat menambahkan konten skrip atau fungsi ke cakupan saat ini menggunakan notasi sumber titik. Saat Anda menjalankan skrip atau fungsi menggunakan notasi sumber titik, skrip tersebut berjalan dalam cakupan saat ini. Fungsi, alias, dan variabel apa pun dalam skrip atau fungsi ditambahkan ke cakupan saat ini.
Misalnya, untuk menjalankan skrip Sample.ps1 dari direktori C:\Scripts dalam cakupan skrip (default untuk skrip), cukup masukkan jalur lengkap ke file skrip pada baris perintah.
C:\scripts\sample.ps1
File skrip harus memiliki ekstensi file .ps1 agar dapat dieksekusi. File yang memiliki spasi di jalurnya harus diapit dalam tanda kutip. Jika Anda mencoba menjalankan jalur yang dikutip, PowerShell menampilkan konten string yang dikutip alih-alih menjalankan skrip. Operator panggilan (&) memungkinkan Anda untuk menjalankan konten string yang berisi nama file.
Menggunakan operator panggilan untuk menjalankan fungsi atau skrip akan menjalankannya dalam cakupan skrip. Menggunakan operator panggilan tidak berbeda dengan menjalankan skrip berdasarkan nama.
& C:\scripts\sample.ps1
Anda dapat membaca selengkapnya tentang operator panggilan di about_Operators.
Untuk menjalankan skrip Sample.ps1 dalam cakupan lokal ketik titik dan spasi (. ) sebelum jalur ke skrip:
. C:\scripts\sample.ps1
Sekarang, fungsi, alias, atau variabel apa pun yang ditentukan dalam skrip ditambahkan ke cakupan saat ini.
Membatasi tanpa cakupan
PowerShell memiliki beberapa opsi dan fitur yang mirip dalam hal ruang lingkup dan dapat berinteraksi dengan ruang lingkup. Fitur ini mungkin bingung dengan cakupan atau perilaku cakupan.
Sesi, modul, dan permintaan berlapis adalah lingkungan mandiri, bukan cakupan anak dari cakupan global dalam sesi.
Sesi
Sesi adalah lingkungan tempat PowerShell berjalan. Saat Anda membuat sesi di komputer jarak jauh, PowerShell membuat koneksi persisten ke komputer jarak jauh. Koneksi persisten memungkinkan Anda menggunakan sesi untuk beberapa perintah terkait.
Karena sesi adalah lingkungan terisolasi, sesi memiliki cakupannya sendiri, tetapi sesi bukanlah cakupan anak dari sesi tempat sesi tersebut dibuat. Sesi dimulai dengan cakupan globalnya sendiri. Cakupan ini independen dari cakupan global sesi tersebut. Anda dapat membuat cakupan anak dalam sesi. Misalnya, Anda dapat menjalankan skrip untuk membuat cakupan anak dalam sesi.
Modul
Anda dapat menggunakan modul PowerShell untuk berbagi dan mengirimkan alat PowerShell. Modul adalah unit yang dapat berisi cmdlet, skrip, fungsi, variabel, alias, dan item berguna lainnya. Kecuali diekspor secara eksplisit (menggunakan Export-ModuleMember atau manifes modul), item dalam modul tidak dapat diakses di luar modul. Oleh karena itu, Anda dapat menambahkan modul ke sesi Anda dan menggunakan item publik tanpa khawatir bahwa item lain mungkin mengambil alih cmdlet, skrip, fungsi, dan item lainnya dalam sesi Anda.
Secara default, modul dimuat ke dalam ruang lingkup root-level (global) runspace. Mengimpor modul tidak mengubah cakupan.
Dalam sesi, modul memiliki cakupannya sendiri. Pertimbangkan modul berikut C:\temp\mod1.psm1:
$a = "Hello"
function foo {
"`$a = $a"
"`$Global:a = $Global:a"
}
Sekarang kita membuat variabel global $a, memberinya nilai dan memanggil fungsi foo.
$a = "Goodbye"
foo
Modul mendeklarasikan variabel $a dalam cakupan modul maka fungsi foo menghasilkan nilai variabel di kedua cakupan.
$a = Hello
$Global:a = Goodbye
Modul membuat kontainer cakupan paralel yang ditautkan ke cakupan tempat modul diimpor. Item yang diekspor oleh modul tersedia mulai dari tingkat cakupan tempat item diimpor. Item yang tidak diekspor dari modul hanya tersedia dalam kontainer cakupan modul. Fungsi dalam modul dapat mengakses item dalam cakupan tempat item diimpor serta item dalam cakupan modul itu sendiri.
Jika Anda memuat Module2 dari dalamModule1, Module2 dimuat ke kontainer cakupan Module1. Setiap ekspor dari Module2 ditempatkan dalam cakupan modul saat ini Module1. Jika Anda menggunakan Import-Module -Scope Local, maka ekspor akan ditempatkan pada objek cakupan saat ini, bukan di tingkat tertinggi. Jika Anda dalam modul dan memuat modul lain menggunakan Import-Module -Scope Global (atau Import-Module -Global), modul tersebut dan ekspornya dimuat ke dalam cakupan global alih-alih cakupan lokal modul.
Fitur WindowsCompatibility melakukan ini untuk mengimpor modul proksi ke status sesi global.
Perintah berlapis
Perintah berlapis tidak memiliki cakupannya sendiri. Saat Anda memasukkan perintah berlapis, perintah berlapis adalah subset lingkungan. Tetapi, Anda tetap berada dalam cakupan lokal.
Skrip memang memiliki cakupannya sendiri. Jika Anda men-debug skrip, dan Anda mencapai titik henti dalam skrip, Anda memasukkan cakupan skrip.
Opsi privat
Alias dan variabel memiliki properti Opsi yang dapat mengambil nilai Private. Item yang memiliki opsi Private dapat dilihat dan diubah dalam cakupan pembuatannya, tetapi tidak dapat dilihat atau diubah di luar cakupan tersebut.
Misalnya, jika Anda membuat variabel yang memiliki opsi privat dalam cakupan global lalu menjalankan skrip, Get-Variable perintah dalam skrip tidak menampilkan variabel privat. Menggunakan pengubah cakupan Global: dalam instans ini tidak menampilkan variabel privat.
Anda dapat menggunakan parameter Opsi dari cmdlet New-Variable, Set-Variable, New-Alias, dan Set-Alias untuk mengatur nilai properti Opsi ke Privat.
Visibilitas
Properti Visibilitas dari variabel atau alias menentukan apakah Anda dapat melihat item di luar kontainer, di mana item tersebut dibuat. Kontainer bisa berupa modul, skrip, atau snap-in. Visibilitas dirancang untuk kontainer dengan cara yang sama seperti nilai Private properti Opsi dirancang untuk cakupan.
Properti Visibilitas menggunakan nilai Public dan Private. Item yang memiliki visibilitas privat hanya dapat dilihat dan diubah dalam kontainer tempat item dibuat. Jika kontainer ditambahkan atau diimpor, item yang memiliki visibilitas privat tidak dapat dilihat atau diubah.
Karena visibilitas dirancang untuk kontainer, visibilitas berfungsi secara berbeda dalam lingkup.
- Jika Anda membuat item yang memiliki visibilitas privat dalam cakupan global, Anda tidak dapat melihat atau mengubah item dalam cakupan apa pun.
- Jika Anda mencoba melihat atau mengubah nilai variabel yang memiliki visibilitas privat, PowerShell mengembalikan pesan kesalahan.
Anda dapat menggunakan cmdlet New-Variable dan Set-Variable untuk membuat variabel yang memiliki visibilitas privat.
Examples
Contoh 1: Mengubah nilai variabel hanya dalam skrip
Perintah berikut mengubah nilai variabel $ConfirmPreference dalam skrip. Perubahan tidak memengaruhi cakupan global.
Pertama, untuk menampilkan nilai variabel $ConfirmPreference dalam cakupan lokal, gunakan perintah berikut:
PS> $ConfirmPreference
High
Buat skrip Scope.ps1 yang berisi perintah berikut:
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
Jalankan skrip. Skrip mengubah nilai variabel $ConfirmPreference lalu melaporkan nilainya dalam cakupan skrip. Output harus menyerupai output berikut:
The value of $ConfirmPreference is Low.
Selanjutnya, uji nilai variabel $ConfirmPreference saat ini dalam cakupan saat ini.
PS> $ConfirmPreference
High
Contoh ini menunjukkan bahwa perubahan pada nilai variabel dalam cakupan skrip tidak memengaruhi nilai variabel dalam cakupan induk.
Contoh 2: Menampilkan nilai variabel dalam cakupan yang berbeda
Anda dapat menggunakan pengubah cakupan untuk melihat nilai variabel dalam cakupan lokal dan dalam cakupan induk.
Pertama, tentukan variabel $test dalam cakupan global.
$test = "Global"
Selanjutnya, buat skrip Sample.ps1 yang menentukan variabel $test. Dalam skrip, gunakan pengubah cakupan untuk merujuk ke versi global atau lokal dari variabel $test.
Dalam Sample.ps1:
$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $Global:test."
Saat Anda menjalankan Sample.ps1, output harus menyerupai output berikut:
The local value of $test is Local.
The global value of $test is Global.
Ketika skrip selesai, hanya nilai global $test yang ditentukan dalam sesi.
PS> $test
Global
Contoh 3: Mengubah nilai variabel dalam cakupan induk
Kecuali Anda melindungi item menggunakan opsi Privat atau metode lain, Anda dapat melihat dan mengubah nilai variabel dalam cakupan induk.
Pertama, tentukan variabel $test dalam cakupan global.
$test = "Global"
Selanjutnya, buat skrip Sample.ps1 yang menentukan variabel $test. Dalam skrip, gunakan pengubah cakupan untuk merujuk ke versi global atau lokal dari variabel $test.
Dalam Sample.ps1:
$Global:test = "Local"
"The global value of `$test is $Global:test."
Ketika skrip selesai, nilai global $test diubah.
PS> $test
Local
Contoh 4: Membuat variabel privat
Variabel dapat dibuat privat dengan menggunakan pengubah cakupan Private: atau dengan membuat variabel dengan opsi yang properti-nya diatur ke Private. Variabel privat hanya dapat dilihat atau diubah dalam cakupan tempat variabel dibuat.
Dalam contoh ini, skrip ScopeExample.ps1 membuat lima fungsi. Fungsi pertama memanggil fungsi berikutnya, yang membuat lingkup turunan. Salah satu fungsi memiliki variabel privat yang hanya dapat dilihat dalam cakupan tempat fungsi dibuat.
PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
"Setting `$funcAVar1 to 'Value set in funcA'"
$funcAVar1 = "Value set in funcA"
funcB
}
function funcB {
"In funcB before set -> '$funcAVar1'"
$Private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
"In funcB after set -> '$funcAVar1'"
funcC
}
function funcC {
"In funcC before set -> '$funcAVar1' - should be the value set in funcA"
$funcAVar1 = "Value set in funcC - Child scopes can see this change."
"In funcC after set -> '$funcAVar1'"
funcD
}
function funcD {
"In funcD before set -> '$funcAVar1' - should be the value from funcC."
$funcAVar1 = "Value set in funcD"
"In funcD after set -> '$funcAVar1'"
'-------------------'
ShowScopes
}
function ShowScopes {
$funcAVar1 = "Value set in ShowScopes"
"Scope [0] (local) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
"Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
"Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
"Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
"Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1
Output menunjukkan nilai variabel di setiap cakupan. Anda dapat melihat bahwa variabel privat hanya terlihat di funcB, cakupan tempat variabel tersebut dibuat.
Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set -> 'Value set in funcD'
-------------------
Scope [0] (local) $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'
Seperti yang ditunjukkan oleh output dari ShowScopes, Anda dapat mengakses variabel dari cakupan lain menggunakan Get-Variable dan menentukan nomor cakupan.
Contoh 5: Menggunakan variabel lokal dalam perintah jarak jauh
Untuk variabel dalam perintah jarak jauh yang dibuat dalam sesi lokal, gunakan pengubah cakupan Using:. PowerShell mengasumsikan bahwa variabel dalam perintah jarak jauh dibuat dalam sesi jarak jauh.
Sintaksnya adalah:
$Using:<VariableName>
Misalnya, perintah berikut membuat variabel $Cred dalam sesi lokal lalu menggunakan variabel $Cred dalam perintah jarak jauh:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}
Pengubah cakupan Using: diperkenalkan di PowerShell 3.0.
Lihat juga
- tentang_Variabel_Lingkungan
- tentang_Fungsi
- about_Script_Blocks
- tentang_Variabel
- ForEach-Object
- Start-ThreadJob