about_Scopes
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:
- Cakupan dapat bersarang. Cakupan luar disebut sebagai cakupan induk. Cakupan berlapis apa pun adalah cakupan anak dari induk tersebut.
- Item terlihat dalam cakupan bahwa item dibuat dan dalam cakupan anak apa pun, kecuali Anda secara eksplisit menjadikannya privat.
- 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 tempat 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 cakupan 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.
Catatan
Fungsi dari modul tidak berjalan dalam cakupan anak dari cakupan panggilan. Modul memiliki status sesi mereka sendiri yang ditautkan ke cakupan 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 anak 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 Get-Variable
Cakupan 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, cakupan induk akan dicari. 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 akar dalam 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 cakupan akar.
Pengubah cakupan
Variabel, alias, atau nama fungsi dapat menyertakan salah satu pengubah cakupan opsional berikut:
global:
- Menentukan bahwa nama ada dalam cakupan Global .local:
- Menentukan bahwa nama ada dalam cakupan Lokal . Cakupan saat ini selalu cakupan Lokal .private:
- Menentukan bahwa nama adalah Privat dan hanya terlihat oleh cakupan saat ini.Catatan
private:
bukan cakupan. Ini adalah opsi yang mengubah aksesibilitas item di luar cakupan tempat item ditentukan.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 berjalan dalam 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 . Contohnya:Ruang nama 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 default 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 saat ini atau lokal :
$a = "one"
Untuk membuat variabel yang sama dalam cakupan global , gunakan pengubah cakupan global:
:
$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 private
cakupan 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 script:
cakupan:
$script:a = "one"
Anda juga dapat menggunakan pengubah cakupan dengan fungsi. Definisi fungsi berikut membuat fungsi dalam cakupan 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 $test
variabel, pertama dalam cakupan lokal lalu dalam cakupan global:
$test
$global:test
Pengubah using:
cakupan
Menggunakan 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 using
cakupan diperkenalkan di PowerShell 3.0.
Untuk skrip atau perintah apa pun yang dijalankan di luar sesi, Anda memerlukan using
pengubah cakupan untuk menyematkan nilai variabel dari cakupan sesi panggilan, sehingga kode di luar sesi dapat mengaksesnya. Pengubah using
cakupan didukung dalam konteks berikut:
- Perintah yang dijalankan dari jarak jauh, dimulai dengan
Invoke-Command
menggunakan parameter ComputerName, HostName, SSHConnection atau Sesi (sesi jarak jauh) - Pekerjaan latar belakang, dimulai dengan
Start-Job
(sesi di luar proses) - Pekerjaan utas, dimulai melalui
Start-ThreadJob
atauForEach-Object -Parallel
(sesi utas terpisah)
Bergantung pada konteksnya, nilai variabel yang disematkan adalah salinan independen dari data dalam cakupan atau referensi pemanggil ke dalamnya. 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 mendapatkan instans variabel PSVariable . Contoh berikut menunjukkan cara membuat referensi dan membuat perubahan dalam pekerjaan utas.
$Count = 1
$refOfCount = Get-Variable Count
Start-ThreadJob {
($using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob
$Count
2
Catatan
Ini bukan operasi aman utas. Anda dapat menyebabkan kerusakan data jika Anda mencoba mengubah nilai dari beberapa utas secara bersamaan. Anda harus menggunakan jenis data aman utas 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 instans objek asli. Ini memiliki properti dan metode jenis. Untuk jenis sederhana, seperti System.Version, salinannya tepat. Untuk jenis kompleks, salinannya tidak sempurna. Misalnya, objek sertifikat yang direhidrasi tidak menyertakan kunci privat.
Instans dari semua jenis lainnya adalah 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 anak, dan merupakan bagian dari cakupan tersebut. Perubahan pada item dalam cakupan apa pun memengaruhi semua cakupan di mana variabel ditentukan.
Mengelola cakupan
Beberapa cmdlet memiliki parameter Cakupan yang memungkinkan Anda 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 Scope
parameter Get-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 Cakupan .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 Get-Item
cmdlet saat Anda berada dalam cakupan. Get-Item
Cmdlet tidak memiliki parameter Cakupan.
Catatan
Untuk cmdlet yang menggunakan parameter Cakupan , Anda juga dapat merujuk ke cakupan menurut angka. Angka tersebut menjelaskan posisi relatif satu cakupan ke cakupan lainnya. Cakupan 0 mewakili cakupan saat ini, atau lokal. Cakupan 1 menunjukkan cakupan induk langsung. Cakupan 2 menunjukkan induk cakupan induk, dan sebagainya. 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 Sample.ps1
skrip dari C:\Scripts
direktori dalam cakupan skrip (default untuk skrip), cukup masukkan jalur lengkap ke file skrip pada baris perintah.
c:\scripts\sample.ps1
File skrip harus memiliki .ps1
ekstensi file 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 yang 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 Sample.ps1
skrip 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 dengan cakupan dan dapat berinteraksi dengan cakupan. 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 yang terkandung, sesi memiliki cakupannya sendiri, tetapi sesi bukanlah cakupan anak dari sesi tempat sesi dibuat. Sesi dimulai dengan cakupan globalnya sendiri. Cakupan ini independen dari cakupan global sesi. 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 cakupan tingkat akar (global) runspace. Mengimpor modul tidak mengubah cakupan.
Dalam sesi, modul memiliki cakupannya sendiri. Pertimbangkan modul C:\temp\mod1.psm1
berikut:
$a = "Hello"
function foo {
"`$a = $a"
"`$global:a = $global:a"
}
Sekarang kita membuat variabel $a
global , memberinya nilai dan memanggil fungsi foo.
$a = "Goodbye"
foo
Modul mendeklarasikan variabel $a
dalam cakupan modul kemudian foo fungsi menghasilkan nilai variabel di kedua cakupan.
$a = Hello
$global:a = Goodbye
Modul membuat kontainer cakupan paralel yang ditautkan ke cakupan tempat kontainer 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 kontainer cakupan modul.
Jika Anda memuat Module2 dari dalam Module1, Module2 dimuat ke dalam kontainer cakupan Module1. Setiap ekspor dari Module2 ditempatkan dalam cakupan modul Module1 saat ini. Jika Anda menggunakan Import-Module -Scope local
, maka ekspor ditempatkan ke dalam objek cakupan saat ini daripada di tingkat atas. Jika Anda berada 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. Tapi, 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 Private
opsi dapat dilihat dan diubah dalam cakupan tempat item dibuat, 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 cmdlet New-Variable
, , New-Alias
Set-Variable
, dan Set-Alias
untuk mengatur nilai properti Opsi ke Privat.
Visibilitas
Properti Visibilitas variabel atau alias menentukan apakah Anda dapat melihat item di luar kontainer, tempat item dibuat. Kontainer bisa berupa modul, skrip, atau snap-in. Visibilitas dirancang untuk kontainer dengan cara yang Private
sama seperti nilai properti Opsi dirancang untuk cakupan.
Properti Visibilitas mengambil Public
nilai 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 cakupan.
- 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 New-Variable
cmdlet dan Set-Variable
untuk membuat variabel yang memiliki visibilitas privat.
Contoh
Contoh 1: Mengubah nilai variabel hanya dalam skrip
Perintah berikut mengubah nilai $ConfirmPreference
variabel dalam skrip. Perubahan tidak memengaruhi cakupan global.
Pertama, untuk menampilkan nilai $ConfirmPreference
variabel 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 $ConfirmPreference
variabel lalu melaporkan nilainya dalam cakupan skrip. Output harus menyerupai output berikut:
The value of $ConfirmPreference is Low.
Selanjutnya, uji nilai $ConfirmPreference
variabel 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 $test
variabel dalam cakupan global.
$test = "Global"
Selanjutnya, buat Sample.ps1
skrip yang menentukan $test
variabel . Dalam skrip, gunakan pengubah cakupan untuk merujuk ke versi $test
global atau lokal variabel.
Di 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 yang $test
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 $test
variabel dalam cakupan global.
$test = "Global"
Selanjutnya, buat skrip Sample.ps1 yang menentukan $test
variabel. Dalam skrip, gunakan pengubah cakupan untuk merujuk ke versi $test
global atau lokal variabel.
Di Sample.ps1:
$global:test = "Local"
"The global value of `$test is $global:test."
Ketika skrip selesai, nilai $test
global diubah.
PS> $test
Local
Contoh 4: Membuat variabel privat
Variabel dapat dibuat privat dengan menggunakan pengubah private:
cakupan atau dengan membuat variabel dengan properti Opsi diatur ke Private
. Variabel privat hanya dapat dilihat atau diubah dalam cakupan tempat variabel dibuat.
Dalam contoh ini, ScopeExample.ps1
skrip membuat lima fungsi. Fungsi pertama memanggil fungsi berikutnya, yang membuat cakupan anak. 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 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 di sesi lokal, gunakan pengubah using
cakupan. PowerShell mengasumsikan bahwa variabel dalam perintah jarak jauh dibuat dalam sesi jarak jauh.
Sintaksnya adalah:
$using:<VariableName>
Misalnya, perintah berikut membuat $Cred
variabel di sesi lokal lalu menggunakan $Cred
variabel dalam perintah jarak jauh:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $using:Cred}
Pengubah using
cakupan diperkenalkan di PowerShell 3.0.