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 yang 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 menjalankan skrip melalui cmdlet seperti Start-Job dan Invoke-Command.

  • 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, SSH Koneksi ion atau Sesi (sesi jarak jauh)
  • Pekerjaan latar belakang, dimulai dengan Start-Job (sesi di luar proses)
  • Pekerjaan utas, dimulai melalui Start-ThreadJob atau ForEach-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.

Dalam sesi utas, sesi tersebut diteruskan oleh referensi. Ini berarti dimungkinkan untuk memodifikasi variabel cakupan anak dalam utas yang berbeda. Untuk memodifikasi variabel dengan aman memerlukan sinkronisasi utas.

Untuk informasi selengkapnya, lihat:

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-Aliasatau 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.psm1berikut:

$a = "Hello"

function foo {
    "`$a = $a"
    "`$global:a = $global:a"
}

Sekarang kita membuat variabel $aglobal , 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 dalamModule1, 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-AliasSet-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.

Lihat juga