Bagikan melalui


about_Automatic_Variables

Deskripsi singkat

Menjelaskan variabel yang menyimpan informasi status untuk dan dibuat dan dikelola oleh PowerShell.

Secara konseptual, sebagian besar variabel ini dianggap baca-saja. Meskipun dapat ditulis, untuk kompatibilitas mundur, mereka tidak boleh ditulis.

Berikut adalah daftar variabel otomatis di PowerShell:

Deskripsi panjang

$$

Berisi token terakhir di baris terakhir yang diterima oleh sesi.

$?

Berisi status eksekusi perintah terakhir. Ini berisi True jika perintah terakhir berhasil dan False jika gagal. Kesalahan penguraian $?tidak mengakibatkan eksekusi, sehingga tidak memengaruhi nilai .

Untuk cmdlet dan fungsi tingkat lanjut yang dijalankan pada beberapa tahap dalam alur, misalnya di process blok dan end , memanggil this.WriteError() atau $PSCmdlet.WriteError() masing-masing pada titik apa pun diatur $? ke False, seperti halnya this.ThrowTerminatingError() dan $PSCmdlet.ThrowTerminatingError().

Write-Error Cmdlet selalu diatur $? ke False segera setelah dijalankan, tetapi tidak akan diatur $? ke False untuk fungsi yang memanggilnya:

function Test-WriteError
{
    Write-Error "Bad"
    "The `$? variable is: $?"
}

Test-WriteError
"Now the `$? variable is: $?"
Test-WriteError : Bad
At line:7 char:1
+ Test-WriteError
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Test-WriteError

The $? variable is: False
Now the $? variable is: True

Untuk tujuan terakhir, $PSCmdlet.WriteError() harus digunakan sebagai gantinya.

Untuk perintah native (executables), $? diatur ke True saat $LASTEXITCODE adalah 0, dan diatur ke False ketika $LASTEXITCODE adalah nilai lain.

Catatan

Hingga PowerShell 7, membungkus pernyataan dalam tanda kurung , sintaks subekspresi (...), atau ekspresi @(...) array selalu diatur ulang $? ke True.$(...) Misalnya, (Write-Error) ditampilkan $? sebagai True. Perilaku ini berubah di PowerShell 7, sehingga $? selalu mencerminkan keberhasilan aktual dari perintah terakhir yang dijalankan dalam ekspresi ini.

$^

Berisi token pertama di baris terakhir yang diterima oleh sesi.

$_

Sama seperti $PSItem. Berisi objek saat ini dalam objek alur. Anda dapat menggunakan variabel ini dalam perintah yang melakukan tindakan pada setiap objek dalam alur.

Untuk informasi selengkapnya, lihat about_PSItem.

$args

Berisi array nilai untuk parameter yang tidak dinyatakan yang diteruskan ke blok fungsi, skrip, atau skrip. Saat membuat fungsi, Anda dapat mendeklarasikan parameter dengan param kata kunci atau dengan menambahkan daftar parameter yang dipisahkan koma dalam tanda kurung setelah nama fungsi.

Dalam tindakan peristiwa, $args variabel berisi objek yang mewakili argumen peristiwa peristiwa yang sedang diproses. Variabel ini hanya diisi dalam Action blok perintah pendaftaran peristiwa. Nilai variabel ini juga dapat ditemukan di properti SourceArgs dari PSEventArgs objek yang Get-Event dikembalikan.

$ConsoleFileName

Berisi jalur file konsol (.psc1) yang terakhir digunakan dalam sesi. Variabel ini diisi saat Anda memulai PowerShell dengan parameter PSConsoleFile atau saat Anda menggunakan Export-Console cmdlet untuk mengekspor nama snap-in ke file konsol.

Saat Anda menggunakan Export-Console cmdlet tanpa parameter, cmdlet secara otomatis memperbarui file konsol yang terakhir digunakan dalam sesi. Anda dapat menggunakan variabel otomatis ini untuk menentukan file yang akan diperbarui.

$Error

Berisi array objek kesalahan yang mewakili kesalahan terbaru. Kesalahan terbaru adalah objek kesalahan pertama dalam array $Error[0].

Untuk mencegah kesalahan ditambahkan ke $Error array, gunakan parameter umum ErrorAction dengan nilai Abaikan. Untuk informasi selengkapnya, lihat about_CommonParameters.

$Event

PSEventArgs Berisi objek yang mewakili peristiwa yang sedang diproses. Variabel ini hanya diisi dalam Action blok perintah pendaftaran peristiwa, seperti Register-ObjectEvent. Nilai variabel ini adalah objek yang sama dengan yang Get-Event dikembalikan cmdlet. Anda dapat menggunakan properti Event variabel, seperti $Event.TimeGenerated, dalam Action blok skrip.

$EventArgs

Berisi objek yang mewakili argumen peristiwa pertama yang berasal dari EventArgs dari peristiwa yang sedang diproses . Variabel ini hanya diisi dalam Action blok perintah pendaftaran peristiwa. Nilai variabel ini juga dapat ditemukan di properti SourceEventArgs dari PSEventArgs objek yang Get-Event dikembalikan.

$EventSubscriber

PSEventSubscriber Berisi objek yang mewakili pelanggan peristiwa peristiwa yang sedang diproses. Variabel ini hanya diisi dalam Action blok perintah pendaftaran peristiwa. Nilai variabel ini adalah objek yang sama dengan yang Get-EventSubscriber dikembalikan cmdlet.

$ExecutionContext

Berisi objek EngineIntrinsics yang mewakili konteks eksekusi host PowerShell. Anda dapat menggunakan variabel ini untuk menemukan objek eksekusi yang tersedia untuk cmdlet.

$false

Berisi False. Anda dapat menggunakan variabel ini untuk mewakili False dalam perintah dan skrip alih-alih menggunakan string "false". String dapat ditafsirkan sebagai True jika dikonversi ke string yang tidak kosong atau ke bilangan bulat bukan nol.

$foreach

Berisi enumerator (bukan nilai yang dihasilkan) dari perulangan ForEach . Variabel $ForEach hanya ada saat ForEach perulangan berjalan; variabel dihapus setelah perulangan selesai.

Enumerator berisi properti dan metode yang dapat Anda gunakan untuk mengambil nilai perulangan dan mengubah iterasi perulangan saat ini. Untuk informasi selengkapnya, lihat Menggunakan Enumerator.

$HOME

Berisi jalur lengkap direktori beranda pengguna. Variabel ini menggunakan nilai "$env:USERPROFILE" variabel lingkungan Windows, biasanya C:\Users\<UserName>.

Penting

Windows dapat mengalihkan lokasi profil pengguna. Ini berarti bahwa $HOME mungkin tidak memiliki nilai yang sama dengan "$env:HOMEDRIVE$env:HOMEPATH".

$Host

Berisi objek yang mewakili aplikasi host saat ini untuk PowerShell. Anda dapat menggunakan variabel ini untuk mewakili host saat ini dalam perintah atau untuk menampilkan atau mengubah properti host, seperti $Host.version atau $Host.CurrentCulture, atau $Host.UI.RawUI.BackGroundColor = "Red".

$input

Berisi enumerator yang menghitung semua input yang diteruskan ke fungsi. Variabel $input hanya tersedia untuk fungsi, blok skrip (yang merupakan fungsi yang tidak disebutkan namanya), dan file skrip (yang merupakan blok skrip yang disimpan).

  • Dalam fungsi tanpa begin, , processatau end blok, $input variabel menghitung koleksi semua input ke fungsi.

  • begin Dalam blok, $input variabel tidak berisi data.

  • process Dalam blok, $input variabel berisi objek saat ini dalam alur.

  • end Dalam blok , $input variabel menghitung pengumpulan semua input ke fungsi.

    Catatan

    Anda tidak dapat menggunakan variabel di $input dalam process blok dan end blok dalam fungsi atau blok skrip yang sama.

Karena $input merupakan enumerator, mengakses salah satu propertinya menyebabkan $input tidak lagi tersedia. Anda dapat menyimpan $input dalam variabel lain untuk menggunakan $input kembali properti.

Enumerator berisi properti dan metode yang dapat Anda gunakan untuk mengambil nilai perulangan dan mengubah iterasi perulangan saat ini. Untuk informasi selengkapnya, lihat Menggunakan Enumerator.

Variabel $input juga tersedia untuk perintah yang ditentukan oleh -Command parameter powershell.exe saat dipanggil dari baris perintah. Contoh berikut dijalankan dari shell Perintah Windows.

echo Hello | powershell -Command """$input World!"""

$LASTEXITCODE

Berisi kode keluar dari program asli terakhir atau skrip PowerShell yang berjalan.

Untuk skrip PowerShell, nilai $LASTEXITCODE tergantung pada bagaimana skrip dipanggil dan apakah exit kata kunci digunakan:

  • Saat skrip menggunakan exit kata kunci:

    $LASTEXITCODE diatur ke nilai yang ditentukan oleh exit kata kunci. Untuk informasi selengkapnya, lihat about_Language_Keywords.

  • Ketika skrip dipanggil secara langsung, seperti ./Test.ps1, atau dengan operator panggilan (&) seperti & ./Test.ps1:

    Nilai $LASTEXITCODE tidak diubah kecuali:

    • Skrip memanggil skrip lain yang menggunakan exit kata kunci
    • Skrip memanggil perintah asli
    • Skrip menggunakan exit kata kunci
  • Saat skrip dipanggil dengan powershell.exe menggunakan parameter File , $LASTEXITCODE diatur ke:

    • 1 jika skrip dihentikan karena pengecualian
    • Nilai yang ditentukan oleh exit kata kunci, jika digunakan dalam skrip
    • 0 jika skrip berhasil diselesaikan
  • Saat skrip dipanggil dengan powershell.exe menggunakan parameter Perintah , $LASTEXITCODE diatur ke:

    • 1 jika skrip dihentikan karena pengecualian atau jika hasil perintah terakhir diatur $? ke $false
    • 0 jika skrip berhasil diselesaikan dan hasil perintah terakhir diatur $? ke $true

Untuk informasi selengkapnya tentang parameter File dan Perintah , lihat about_PowerShell_exe.

$Matches

Variabel $Matches bekerja dengan -match operator dan -notmatch . Saat Anda mengirimkan input skalar ke operator atau -notmatch , dan salah satu mendeteksi kecocokan-match, mereka mengembalikan nilai Boolean dan mengisi $Matches variabel otomatis dengan tabel hash dari nilai string apa pun yang cocok. Tabel $Matches hash juga dapat diisi dengan tangkapan saat Anda menggunakan ekspresi reguler dengan -match operator.

Untuk informasi selengkapnya tentang -match operator, lihat about_Comparison_Operators. Untuk informasi selengkapnya tentang ekspresi reguler, lihat about_Regular_Expressions.

Variabel $Matches juga berfungsi dalam switch pernyataan dengan -Regex parameter . Ini diisi dengan cara yang sama seperti -match operator dan -notmatch . Untuk informasi selengkapnya tentang pernyataan tersebut switch , lihat about_Switch.

Catatan

Ketika $Matches diisi dalam sesi, ia mempertahankan nilai yang cocok sampai ditimpa oleh kecocokan lain. Jika -match digunakan lagi dan tidak ada kecocokan yang ditemukan, itu tidak diatur ulang $Matches ke $null. Nilai yang dicocokkan sebelumnya disimpan di $Matches hingga kecocokan lain ditemukan.

$MyInvocation

Berisi informasi tentang perintah saat ini, seperti nama, parameter, nilai parameter, dan informasi tentang bagaimana perintah dimulai, dipanggil, atau dipanggil, seperti nama skrip yang memanggil perintah saat ini.

$MyInvocation hanya diisi untuk blok skrip, fungsi, dan skrip. Anda dapat menggunakan informasi dalam objek System.Management.Automation.InvocationInfo yang $MyInvocation dikembalikan dalam skrip saat ini, seperti nama fungsi ($MyInvocation.MyCommand.Name) untuk mengidentifikasi perintah saat ini. Ini berguna untuk menemukan nama skrip saat ini.

Dimulai di PowerShell 3.0, MyInvocation memiliki properti baru berikut ini.

  • PSScriptRoot - Berisi jalur lengkap ke skrip yang memanggil perintah saat ini. Nilai properti ini hanya diisi ketika pemanggil adalah skrip.
  • PSCommandPath - Berisi jalur lengkap dan nama file skrip yang memanggil perintah saat ini. Nilai properti ini hanya diisi ketika pemanggil adalah skrip.

$PSScriptRoot Tidak seperti variabel dan $PSCommandPath otomatis, properti PSScriptRoot dan PSCommandPath dari $MyInvocation variabel otomatis berisi informasi tentang pemanggil atau skrip panggilan, bukan skrip saat ini.

$NestedPromptLevel

Berisi tingkat perintah saat ini. Nilai 0 menunjukkan tingkat permintaan asli. Nilainya akan dinaikkan saat Anda memasukkan tingkat berlapis dan mengalami penurunan saat Anda keluar darinya.

Misalnya, PowerShell menyajikan prompt perintah berlapis saat Anda menggunakan metode .$Host.EnterNestedPrompt PowerShell juga menyajikan prompt perintah berlapis saat Anda mencapai titik henti di debugger PowerShell.

Saat Anda memasukkan perintah berlapis, PowerShell menjeda perintah saat ini, menyimpan konteks eksekusi, dan menaikkan nilai $NestedPromptLevel variabel. Untuk membuat perintah berlapis tambahan (hingga 128 tingkat) atau untuk kembali ke prompt perintah asli, selesaikan perintah, atau ketik exit.

Variabel $NestedPromptLevel ini membantu Anda melacak tingkat prompt. Anda dapat membuat prompt perintah PowerShell alternatif yang menyertakan nilai ini sehingga selalu terlihat.

$null

$null adalah variabel otomatis yang berisi nilai null atau kosong. Anda dapat menggunakan variabel ini untuk mewakili nilai yang tidak ada atau tidak terdefinisi dalam perintah dan skrip.

PowerShell memperlakukan $null sebagai objek dengan nilai, atau tempat penampung, sehingga Anda dapat menggunakan $null untuk mewakili nilai kosong dalam kumpulan nilai.

Misalnya, ketika $null disertakan dalam koleksi, itu dihitung sebagai salah satu objek.

$a = "one", $null, "three"
$a.count
3

Jika Anda menyalurkan $null variabel ke ForEach-Object cmdlet, itu menghasilkan nilai untuk $null, seperti halnya untuk objek lain

"one", $null, "three" | ForEach-Object { "Hello " + $_}
Hello one
Hello
Hello three

Akibatnya, Anda tidak dapat menggunakan $null untuk berarti tidak ada nilai parameter. Nilai $null parameter mengambil alih nilai parameter default.

Namun, karena PowerShell memperlakukan $null variabel sebagai tempat penampung, Anda dapat menggunakannya dalam skrip seperti yang berikut ini, yang tidak akan berfungsi jika $null diabaikan.

$calendar = @($null, $null, "Meeting", $null, $null, "Team Lunch", $null)
$days = "Sunday","Monday","Tuesday","Wednesday","Thursday",
        "Friday","Saturday"
$currentDay = 0
foreach($day in $calendar)
{
    if($day -ne $null)
    {
        "Appointment on $($days[$currentDay]): $day"
    }

    $currentDay++
}
Appointment on Tuesday: Meeting
Appointment on Friday: Team lunch

$PID

Berisi pengidentifikasi proses (PID) dari proses yang menghosting sesi PowerShell saat ini.

$PROFILE

Berisi jalur lengkap profil PowerShell untuk pengguna saat ini dan aplikasi host saat ini. Anda dapat menggunakan variabel ini untuk mewakili profil dalam perintah. Misalnya, Anda dapat menggunakannya dalam perintah untuk menentukan apakah profil telah dibuat:

Test-Path $PROFILE

Atau, Anda dapat menggunakannya dalam perintah untuk membuat profil:

New-Item -ItemType file -Path $PROFILE -Force

Anda dapat menggunakannya dalam perintah untuk membuka profil di notepad.exe:

notepad.exe $PROFILE

$PSBoundParameters

Berisi kamus parameter yang diteruskan ke skrip atau fungsi dan nilainya saat ini. Variabel ini hanya memiliki nilai dalam cakupan di mana parameter dideklarasikan, seperti skrip atau fungsi. Anda dapat menggunakannya untuk menampilkan atau mengubah nilai parameter saat ini atau untuk meneruskan nilai parameter ke skrip atau fungsi lain.

Dalam contoh ini, fungsi Test2 meneruskan $PSBoundParameters ke fungsi Test1 . $PSBoundParameters ditampilkan dalam format Kunci dan Nilai.

function Test1 {
   param($a, $b)

   # Display the parameters in dictionary format.
   $PSBoundParameters
}

function Test2 {
   param($a, $b)

   # Run the Test1 function with $a and $b.
   Test1 @PSBoundParameters
}
Test2 -a Power -b Shell
Key   Value
---   -----
a     Power
b     Shell

$PSCmdlet

Berisi objek yang mewakili cmdlet atau fungsi tingkat lanjut yang sedang dijalankan.

Anda dapat menggunakan properti dan metode objek dalam cmdlet atau kode fungsi Anda untuk merespons kondisi penggunaan. Misalnya, properti ParameterSetName berisi nama set parameter yang sedang digunakan, dan metode ShouldProcess menambahkan parameter WhatIf dan Confirm ke cmdlet secara dinamis.

Untuk informasi selengkapnya tentang $PSCmdlet variabel otomatis, lihat about_Functions_CmdletBindingAttribute dan about_Functions_Advanced.

$PSCommandPath

Berisi jalur lengkap dan nama file skrip yang sedang dijalankan. Variabel ini valid di semua skrip.

$PSCulture

Berisi nama budaya yang saat ini digunakan dalam sistem operasi. Budaya menentukan format tampilan item seperti angka, mata uang, dan tanggal, dan disimpan dalam objek System.Globalization.CultureInfo . Gunakan Get-Culture untuk menampilkan budaya komputer. $PSCultureberisi nilai properti Nama.

$PSDebugContext

Saat penelusuran kesalahan, variabel ini berisi informasi tentang lingkungan penelusuran kesalahan. Jika tidak, ini berisi nilai null . Akibatnya, Anda dapat menggunakannya untuk menentukan apakah debugger memiliki kontrol. Ketika diisi, ini berisi objek PsDebugContext yang memiliki properti Breakpoints dan InvocationInfo . Properti InvocationInfo memiliki beberapa properti yang berguna, termasuk properti Lokasi . Properti Lokasi menunjukkan jalur skrip yang sedang di-debug.

$PSEdition

Berisi nilai yang sama dalam $PSVersionTable.PSEdition. Variabel ini tersedia untuk digunakan dalam file manifes modul, sedangkan $PSVersionTable tidak.

$PSHOME

Berisi jalur lengkap direktori penginstalan untuk PowerShell, biasanya, $env:windir\System32\PowerShell\v1.0 dalam sistem Windows. Anda dapat menggunakan variabel ini di jalur file PowerShell. Misalnya, perintah berikut mencari topik Bantuan konseptual untuk kata Bantuan:

Select-String -Pattern Help -Path $PSHOME\en-US\*.txt

$PSItem

Sama seperti $_. Berisi objek saat ini dalam objek alur. Anda dapat menggunakan variabel ini dalam perintah yang melakukan tindakan pada setiap objek dalam alur.

Untuk informasi selengkapnya, lihat about_PSItem.

$PSScriptRoot

Berisi jalur lengkap direktori induk skrip yang dijalankan.

Di PowerShell 2.0, variabel ini hanya valid dalam modul skrip (.psm1). Dimulai di PowerShell 3.0, ini valid di semua skrip.

$PSSenderInfo

Berisi informasi tentang pengguna yang memulai PSSession, termasuk identitas pengguna dan zona waktu komputer asal. Variabel ini hanya tersedia dalam PSSessions.

Variabel $PSSenderInfo ini mencakup properti yang dapat dikonfigurasi pengguna, ApplicationArguments, yang secara default, hanya $PSVersionTable berisi dari sesi asal. Untuk menambahkan data ke properti ApplicationArguments , gunakan parameter ApplicationArguments cmdlet New-PSSessionOption .

$PSUICulture

Berisi nama budaya antarmuka pengguna (UI) yang dikonfigurasi dalam sistem operasi. Budaya UI menentukan string teks mana yang digunakan untuk elemen antarmuka pengguna, seperti menu dan pesan. Ini adalah nilai System.Globalization.CultureInfo.Current UICulture.Name properti sistem. Untuk mendapatkan objek System.Globalization.CultureInfo untuk sistem, gunakan Get-UICulture cmdlet .

$PSVersionTable

Berisi tabel hash baca-saja yang menampilkan detail tentang versi PowerShell yang berjalan dalam sesi saat ini. Tabel menyertakan item berikut:

  • BuildVersion - Nomor build versi saat ini
  • CLRVersion - Versi runtime bahasa umum (CLR)
  • PSCompatibleVersions - Versi PowerShell yang kompatibel dengan versi saat ini
  • PSEdition - Properti ini memiliki nilai 'Desktop', untuk versi klien Windows Server dan Windows. Properti ini memiliki nilai 'Core' untuk PowerShell yang berjalan di bawah Nano Server atau Windows IoT.
  • PSRemotingProtocolVersion - Versi protokol manajemen jarak jauh PowerShell.
  • PSVersion - Nomor versi PowerShell
  • SerializationVersion - Versi metode serialisasi
  • WSManStackVersion - Nomor versi tumpukan WS-Management

$PWD

Berisi objek jalur yang mewakili jalur lengkap lokasi direktori saat ini untuk runspace PowerShell saat ini.

Catatan

PowerShell mendukung beberapa runspace per proses. Setiap runspace memiliki direktorinya sendiri saat ini. Ini tidak sama dengan direktori proses saat ini: [System.Environment]::CurrentDirectory.

$Sender

Berisi objek yang menghasilkan kejadian ini. Variabel ini hanya diisi dalam blok Tindakan dari perintah pendaftaran peristiwa. Nilai variabel ini juga dapat ditemukan di properti PSEventArgs Pengirim objek yang Get-Event mengembalikan.

$ShellId

Berisi pengidentifikasi shell saat ini.

$StackTrace

Berisi pelacakan tumpukan untuk kesalahan terbaru.

$switch

Berisi enumerator bukan nilai pernyataan yang Switch dihasilkan. Variabel $switch hanya ada saat Switch pernyataan berjalan; itu dihapus ketika switch pernyataan menyelesaikan eksekusi. Untuk informasi selengkapnya, lihat about_Switch.

Enumerator berisi properti dan metode yang dapat Anda gunakan untuk mengambil nilai perulangan dan mengubah iterasi perulangan saat ini. Untuk informasi selengkapnya, lihat Menggunakan Enumerator.

$this

Variabel $this digunakan dalam blok skrip yang memperluas kelas untuk merujuk ke instans kelas itu sendiri.

Extensible Type System (ETS) PowerShell memungkinkan Anda menambahkan properti ke kelas menggunakan blok skrip. Dalam blok skrip yang menentukan properti skrip atau metode skrip, $this variabel mengacu pada instans objek kelas yang sedang diperluas. Misalnya, PowerShell menggunakan ETS untuk menambahkan properti BaseName ke kelas FileInfo .

PS> Get-ChildItem .\README.md | Get-Member BaseName | Format-List

TypeName   : System.IO.FileInfo
Name       : BaseName
MemberType : ScriptProperty
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt 0)
             {$this.Name.Remove($this.Name.Length - $this.Extension.Length
             )}else{$this.Name};}

Untuk informasi selengkapnya, lihat about_Types.ps1xml.

Dalam kelas PowerShell, $this variabel mengacu pada objek instans kelas itu sendiri, memungkinkan akses ke properti dan metode yang ditentukan di kelas . Untuk informasi selengkapnya, lihat about_Classes.

Variabel $this ini juga digunakan oleh kelas peristiwa .NET yang mengambil blok skrip sebagai delegasi untuk penanganan aktivitas. Dalam skenario ini, $this mewakili objek yang berasal dari peristiwa, yang dikenal sebagai pengirim peristiwa.

$true

Berisi True. Anda dapat menggunakan variabel ini untuk mewakili True dalam perintah dan skrip.

Menggunakan Enumerator

Variabel $input, $foreach, dan $switch adalah semua enumerator yang digunakan untuk melakukan iterasi melalui nilai yang diproses oleh blok kode yang berisinya.

Enumerator berisi properti dan metode yang dapat Anda gunakan untuk memajukan atau mengatur ulang iterasi, atau mengambil nilai iterasi. Memanipulasi enumerator secara langsung tidak dianggap sebagai praktik terbaik.

  • Dalam perulangan, kata kunci kontrol alur putus dan lanjutkan harus lebih disukai.

  • Dalam fungsi yang menerima input alur, praktik terbaik adalah menggunakan parameter dengan atribut ValueFromPipeline atau ValueFromPipelineByPropertyName .

    Untuk informasi selengkapnya, lihat about_Functions_Advanced_Parameters.

MoveNext

Metode MoveNext memajukan enumerator ke elemen koleksi berikutnya. MoveNext mengembalikan True jika enumerator berhasil dimajukan, False jika enumerator telah melewati akhir koleksi.

Catatan

Nilai Boolean yang dikembalikan oleh MoveNext dikirim ke aliran output. Anda dapat menekan output dengan mengetikkannya atau [void] memilahnya ke Out-Null.

$input.MoveNext() | Out-Null
[void]$input.MoveNext()

Reset

Metode ini Reset mengatur enumerator ke posisi awalnya, yaitu sebelum elemen pertama dalam koleksi.

Current

Properti Current mendapatkan elemen dalam koleksi, atau alur, pada posisi enumerator saat ini.

Properti Current terus mengembalikan properti yang sama hingga MoveNext dipanggil.

Contoh

Contoh 1: Menggunakan variabel $input

Dalam contoh berikut, mengakses $input variabel akan menghapus variabel hingga lain kali blok proses dijalankan. Menggunakan metode mereset Reset $input variabel ke nilai alur saat ini.

function Test
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        "`tInput: $input"
        "`tAccess Again: $input"
        $input.Reset()
        "`tAfter Reset: $input"
    }
}

"one","two" | Test
Iteration: 0
    Input: one
    Access Again:
    After Reset: one
Iteration: 1
    Input: two
    Access Again:
    After Reset: two

Blok proses secara otomatis memajukan $input variabel bahkan jika Anda tidak mengaksesnya.

$skip = $true
function Skip
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        if ($skip)
        {
            "`tSkipping"
            $skip = $false
        }
        else
        {
            "`tInput: $input"
        }
    }
}

"one","two" | Skip
Iteration: 0
    Skipping
Iteration: 1
    Input: two

Contoh 2: Menggunakan $input di luar blok proses

Di luar blok $input proses, variabel mewakili semua nilai yang disalurkan ke dalam fungsi.

  • $input Mengakses variabel akan menghapus semua nilai.
  • Metode mereset Reset seluruh koleksi.
  • Properti Current tidak pernah diisi.
  • Metode MoveNext mengembalikan false karena koleksi tidak dapat dimajukan.
    • Memanggil MoveNext menghapus $input variabel.
Function All
{
    "All Values: $input"
    "Access Again: $input"
    $input.Reset()
    "After Reset: $input"
    $input.MoveNext() | Out-Null
    "After MoveNext: $input"
}

"one","two","three" | All
All Values: one two three
Access Again:
After Reset: one two three
After MoveNext:

Contoh 3: Menggunakan $input.Current harta benda

Current Dengan properti , nilai alur saat ini dapat diakses beberapa kali tanpa menggunakan Reset metode . Blok proses tidak secara otomatis memanggil metode MoveNext .

Properti Current tidak pernah diisi kecuali Anda secara eksplisit memanggil MoveNext. Properti Current dapat diakses beberapa kali di dalam blok proses tanpa menghapus nilainya.

function Current
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        "`tBefore MoveNext: $($input.Current)"
        $input.MoveNext() | Out-Null
        "`tAfter MoveNext: $($input.Current)"
        "`tAccess Again: $($input.Current)"
    }
}

"one","two" | Current
Iteration: 0
    Before MoveNext:
    After MoveNext: one
    Access Again: one
Iteration: 1
    Before MoveNext:
    After MoveNext: two
    Access Again: two

Contoh 4: Menggunakan variabel $foreach

$input Tidak seperti variabel, $foreach variabel selalu mewakili semua item dalam koleksi saat diakses secara langsung. Current Gunakan properti untuk mengakses elemen koleksi saat ini, dan Reset metode MoveNext dan untuk mengubah nilainya.

Catatan

Setiap perulangan perulangan foreach secara otomatis memanggil metode MoveNext .

Perulangan berikut hanya dijalankan dua kali. Dalam iterasi kedua, koleksi dipindahkan ke elemen ketiga sebelum iterasi selesai. Setelah iterasi kedua, sekarang tidak ada lagi nilai untuk iterasi, dan perulangan berakhir.

Properti MoveNext tidak memengaruhi variabel yang dipilih untuk melakukan iterasi melalui koleksi ($Num).

$i = 0
foreach ($num in ("one","two","three"))
{
    "Iteration: $i"
    $i++
    "`tNum: $num"
    "`tCurrent: $($foreach.Current)"

    if ($foreach.Current -eq "two")
    {
        "Before MoveNext (Current): $($foreach.Current)"
        $foreach.MoveNext() | Out-Null
        "After MoveNext (Current): $($foreach.Current)"
        "Num hasn't changed: $num"
    }
}
Iteration: 0
        Num: one
        Current: one
Iteration: 1
        Num: two
        Current: two
Before MoveNext (Current): two
After MoveNext (Current): three
Num hasn't changed: two

Menggunakan metode mengatur Reset ulang elemen saat ini dalam koleksi. Contoh berikut mengulang melalui dua elemen pertama dua kali karena metode dipanggil Reset . Setelah dua perulangan pertama, if pernyataan gagal dan perulangan berulang melalui ketiga elemen secara normal.

Penting

Ini dapat mengakibatkan perulangan tak terbatas.

$stopLoop = 0
foreach ($num in ("one","two", "three"))
{
    ("`t" * $stopLoop) + "Current: $($foreach.Current)"

    if ($num -eq "two" -and $stopLoop -lt 2)
    {
        $foreach.Reset()
        ("`t" * $stopLoop) + "Reset Loop: $stopLoop"
        $stopLoop++
    }
}
Current: one
Current: two
Reset Loop: 0
        Current: one
        Current: two
        Reset Loop: 1
                Current: one
                Current: two
                Current: three

Contoh 5: Menggunakan variabel $switch

Variabel $switch memiliki aturan yang sama persis dengan $foreach variabel . Contoh berikut menunjukkan semua konsep enumerator.

Catatan

Perhatikan bagaimana kasus NotEvaluated tidak pernah dijalankan, meskipun tidak break ada pernyataan setelah metode MoveNext .

$values = "Start", "MoveNext", "NotEvaluated", "Reset", "End"
$stopInfinite = $false
switch ($values)
{
    "MoveNext" {
        "`tMoveNext"
        $switch.MoveNext() | Out-Null
        "`tAfter MoveNext: $($switch.Current)"
    }
    # This case is never evaluated.
    "NotEvaluated" {
        "`tAfterMoveNext: $($switch.Current)"
    }

    "Reset" {
        if (!$stopInfinite)
        {
            "`tReset"
            $switch.Reset()
            $stopInfinite = $true
        }
    }

    default {
        "Default (Current): $($switch.Current)"
    }
}
Default (Current): Start
    MoveNext
    After MoveNext: NotEvaluated
    Reset
Default (Current): Start
    MoveNext
    After MoveNext: NotEvaluated
Default (Current): End

Lihat juga