Bagikan melalui


7. Ekspresi

Catatan editorial

Penting

Windows PowerShell Language Specification 3.0 diterbitkan pada Desember 2012 dan didasarkan pada Windows PowerShell 3.0. Spesifikasi ini tidak mencerminkan status PowerShell saat ini. Tidak ada rencana untuk memperbarui dokumentasi ini untuk mencerminkan status saat ini. Dokumentasi ini disajikan di sini untuk referensi historis.

Dokumen spesifikasi tersedia sebagai dokumen Microsoft Word dari Pusat Unduhan Microsoft di: https://www.microsoft.com/download/details.aspx?id=36389 Dokumen Word telah dikonversi untuk presentasi di sini di Microsoft Learn. Selama konversi, beberapa perubahan editorial telah dilakukan untuk mengakomodasi pemformatan untuk platform Dokumen. Beberapa kesalahan ketik dan kesalahan kecil telah dikoreksi.

Sintaksis:

expression:
    primary-expression
    bitwise-expression
    logical-expression
    comparison-expression
    additive-expression
    multiplicative-expression

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

dashdash:
    dash dash

Deskripsi:

Ekspresi adalah urutan operator dan operand yang menunjuk metode, fungsi, lokasi yang dapat ditulis, atau nilai; menentukan komputasi nilai; menghasilkan satu atau beberapa efek samping; atau melakukan beberapa kombinasinya. Misalnya

  • Literal 123 adalah ekspresi yang mengacu pada nilai integer 123.
  • Ekspresi 1,2,3,4 menunjuk objek array 4 elemen yang memiliki nilai yang diperlihatkan.
  • Ekspresi 10.4 * $a menentukan komputasi.
  • Ekspresi $a++ menghasilkan efek samping.
  • Ekspresi $a[$i--] = $b[++$j] melakukan kombinasi hal-hal ini.

Kecuali sebagaimana ditentukan untuk beberapa operator, urutan evaluasi istilah dalam ekspresi dan urutan di mana efek samping terjadi keduanya tidak ditentukan. Contoh perilaku yang tidak ditentukan termasuk yang berikut ini: $i++ + $i, $i + --$i, dan $w[$j++] = $v[$j].

Implementasi PowerShell dapat memberikan dukungan untuk jenis yang ditentukan pengguna, dan jenis tersebut mungkin memiliki operasi yang ditentukan pada mereka. Semua detail jenis dan operasi tersebut ditentukan implementasinya.

Ekspresi tingkat atas adalah ekspresi yang bukan bagian dari beberapa ekspresi yang lebih besar. Jika ekspresi tingkat atas berisi operator efek samping, nilai ekspresi tersebut tidak ditulis ke pipeline; jika tidak, nilai tersebut akan ditulis. Lihat §7.1.1 untuk diskusi terperinci tentang hal ini.

Biasanya, ekspresi yang menunjuk koleksi ([§4§4]) dijumlahkan ke dalam elemen konstituennya ketika nilai ekspresi tersebut digunakan. Namun, ini tidak terjadi ketika ekspresi adalah invoasi cmdlet (perintah shell dalam PowerShell). Misalnya

$x = 10,20,30
$a = $($x; 99)                     # $a.Length is 4

$x = New-Object 'int[]' 3
$a = $($x; 99)                     # equivalent, $a.Length is 4

$a = $(New-Object 'int[]' 3; 99)   # $a.Length is 2

Dalam dua penggunaan pertama operator $(...), ekspresi yang menunjuk koleksi adalah variabel $x, yang dijumlahkan menghasilkan tiga nilai int, ditambah int 99. Namun, dalam kasus ketiga, ekspresi adalah panggilan langsung ke cmdlet, sehingga hasilnya tidak dijumlahkan, dan $a adalah array dari dua elemen, int[3] dan int.

Jika operasi tidak ditentukan oleh PowerShell, jenis nilai yang ditunjuk oleh operand kiri diperiksa untuk melihat apakah operasi tersebut memiliki metode op_<operation> yang sesuai.

7.1 Ekspresi utama

Sintaksis:

primary-expression:
    value
    member-access
    element-access
    invocation-expression
    post-increment-expression
    post-decrement-expression

value:
    parenthesized-expression
    sub-expression
    array-expression
    script-block-expression
    hash-literal-expression
    literal
    type-literal
    variable

7.1.1 Mengelompokkan tanda kurung

Sintaksis:

Saran

Notasi ~opt~ dalam definisi sintaks menunjukkan bahwa entitas leksikal bersifat opsional dalam sintaks.

parenthesized-expression:
    ( new-lines~opt~ pipeline new-lines~opt~ )

Deskripsi:

Ekspresi yang dikurung adalah ekspresi primer yang jenis dan nilainya sama dengan ekspresi tanpa tanda kurung. Jika ekspresi menunjuk variabel, ekspresi yang dikurung menunjuk variabel yang sama. Misalnya, $x.m dan ($x).m setara.

Kurung pengelompokan dapat digunakan dalam ekspresi untuk mendokumentasikan preseden dan asosiasi default dalam ekspresi. Mereka juga dapat digunakan untuk mengambil alih prioritas default dan asosiativitas. Misalnya

4 + 6 * 2    # 16
4 + (6 * 2)  # 16 document default precedence
(4 + 6) * 2  # 20 override default precedence

Biasanya, pengelompokan tanda kurung di tingkat paling atas berlebihan. Namun, itu tidak selalu terjadi. Pertimbangkan contoh berikut:

2,4,6       # Length 3; values 2,4,6
(2,4),6     # Length 2; values [Object[]],int

Dalam kasus kedua, tanda kurung mengubah semantik, menghasilkan array yang dua elemennya terdiri dari sebuah array dengan 2 bilangan int dan bilangan int skalar 6.

Berikut adalah pengecualian lain:

23.5/2.4          # pipeline gets 9.79166666666667
$a = 1234 * 3.5   # value not written to pipeline
$a                # pipeline gets 4319

Dalam kasus pertama dan ketiga, nilai hasil ditulis ke pipa. Namun, meskipun ekspresi dalam kasus kedua dievaluasi, hasilnya tidak ditulis ke alur karena adanya operator efek samping = di tingkat atas. (Penghapusan bagian $a = memungkinkan nilai ditulis, karena * bukan operator efek samping.)

Untuk menghentikan nilai ekspresi apa pun yang tidak berisi efek samping tingkat atas agar tidak ditulis ke alur, buang secara eksplisit, sebagai berikut:

# None of these value are written to pipeline
[void](23.5/2.4)
[void]$a
$null = $a
$a > $null

Untuk menulis ke alur nilai ekspresi apa pun yang berisi efek samping tingkat atas, sertakan ekspresi tersebut dalam tanda kurung, sebagai berikut:

($a = 1234 * 3.5) # pipeline gets 4319

Dengan demikian, tanda kurung pengelompokan dalam kasus ini tidak berlebihan.

Dalam contoh berikut, kami memiliki substitusi variabel (§2.3.5.2) yang berlangsung dalam string literal:

">$($a = -23)<"    # value not written to pipeline, get ><
">$(($a = -23))<"  # pipeline gets >-23<

Dalam kasus pertama, tanda kurung mewakili pembatas sub-ekspresi , bukan tanda kurung pengelompok , dan karena ekspresi tingkat atas berisi operator efek samping, nilainya tidak diteruskan ke dalam alur. Tentu saja, karakter > dan < masih ditulis.) Jika tanda kurung pengelompokan ditambahkan -- seperti yang ditunjukkan dalam kasus kedua -- penulisan menjadi aktif.

Contoh berikut masing-masing berisi operator efek samping tingkat atas:

$a = $b = 0      # value not written to pipeline
$a = ($b = 0)    # value not written to pipeline
($a = ($b = 0))  # pipeline gets 0

++$a             # value not written to pipeline
(++$b)           # pipeline gets 1

$a--             # value not written to pipeline
($b--)           # pipeline gets 1

Penggunaan tanda kurung pengelompokan di sekitar ekspresi yang tidak berisi efek samping tingkat atas membuat tanda kurung tersebut berlebihan. Misalnya;

$a      # pipeline gets 0
($a)    # no side effect, so () redundant

Pertimbangkan contoh berikut yang memiliki dua efek samping, tidak satupun yang berada di tingkat teratas.

12.6 + ($a = 10 - ++$b) # pipeline gets 21.6.

Hasilnya ditulis ke alur, karena ekspresi tingkat atas tidak memiliki efek samping.

7.1.2 Akses anggota

Sintaksis:

member-access:
    primary-expression . new-line~opt~ member-name
    primary-expression :: new-line~opt~ member-name

Perhatikan bahwa tidak ada spasi kosong yang diizinkan setelah ekspresi utama.

Deskripsi:

Operator . digunakan untuk memilih anggota instans dari objek, atau kunci dari Hashtable. Operand kiri harus menunjuk objek, dan operand kanan harus menunjuk anggota instans yang dapat diakses.

Baik operand kanan menunjuk anggota instans yang dapat diakses dalam jenis objek yang ditunjuk oleh operand kiri atau, jika operand kiri menunjuk array, operand kanan menunjuk anggota instans yang dapat diakses dalam setiap elemen array.

Spasi kosong tidak diizinkan sebelum operator ..

Operator ini dibiarkan asosiatif.

Operator :: digunakan untuk memilih anggota statis dari jenis tertentu. Operan kiri harus menunjuk jenis, dan operand sebelah kanan harus menunjuk anggota statis yang dapat diakses dalam jenis tersebut.

Spasi kosong tidak diizinkan sebelum operator ::.

Operator ini dibiarkan asosiatif.

Jika operand sebelah kanan menunjuk lokasi bisa-tulis dalam jenis objek yang ditunjuk oleh operand kiri, maka seluruh ekspresi menunjuk lokasi bisa-tulis.

Contoh:

$a = 10, 20, 30
$a.Length                    # get instance property

(10, 20, 30).Length

$property = "Length"
$a.$property                 # property name is a variable

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123
}
$h1.FirstName                # designates the key FirstName
$h1.Keys                     # gets the collection of keys

[int]::MinValue              # get static property
[double]::PositiveInfinity   # get static property
$property = "MinValue"
[long]::$property            # property name is a variable

foreach ($t in [byte], [int], [long]) {
    $t::MaxValue             # get static property
}

$a = @{ID = 1 }, @{ID = 2 }, @{ID = 3 }
$a.ID                        # get ID from each element in the array

7.1.3 Ekspresi pemanggilan

Sintaksis:

invocation-expression:
    primary-expression . new-line~opt~ member-name argument-list
    primary-expression :: new-line~opt~ member-name argument-list

argument-list:
    ( argument-expression-list~opt~ new-lines~opt~ )

Perhatikan bahwa tidak ada spasi kosong yang diizinkan setelah ekspresi utama.

Deskripsi:

Ekspresi pemanggilan memanggil metode yang ditunjuk oleh primary-expression.member-name atau primary-expression::member-name. Tanda kurung dalam daftar argumen berisi daftar ekspresi yang mungkin kosong dan dipisahkan koma yang menunjuk argumen yang nilainya diteruskan ke metode . Sebelum metode dipanggil, argumen dievaluasi dan dikonversi sesuai dengan aturan §6, jika perlu, untuk mencocokkan jenis yang diharapkan oleh metode . Urutan evaluasi primary-expression.member-name, primary-expression::member-name, dan argumen tidak ditentukan.

Operator ini dibiarkan asosiatif.

Jenis hasil dari ekspresi pemanggilan adalah penunjuk metode (§4.5.24).

Contoh:

[Math]::Sqrt(2.0)            # call method with argument 2.0
[char]::IsUpper("a")         # call method
$b = "abc#$%XYZabc"
$b.ToUpper()                 # call instance method

[Math]::Sqrt(2)              # convert 2 to 2.0 and call method
[Math]::Sqrt(2D)             # convert 2D to 2.0 and call method
[Math]::Sqrt($true)          # convert $true to 1.0 and call method
[Math]::Sqrt("20")           # convert "20" to 20 and call method

$a = [Math]::Sqrt            # get method descriptor for Sqrt
$a.Invoke(2.0)               # call Sqrt via the descriptor
$a = [Math]::("Sq"+"rt")     # get method descriptor for Sqrt
$a.Invoke(2.0)               # call Sqrt via the descriptor
$a = [char]::ToLower         # get method descriptor for ToLower
$a.Invoke("X")               # call ToLower via the descriptor

7.1.4 Akses elemen

Sintaksis:

element-access:
    primary-expression [ new-lines~opt~ expression new-lines~opt~ ]

Deskripsi:

Tidak boleh ada spasi kosong antara ekspresi utama dan tanda kurung siku kiri ().

7.1.4.1 Mengindeks array

Deskripsi:

Array dibahas secara rinci dalam §9. Jika ekspresi adalah array satu dimensi, lihat §7.1.4.5.

Saat ekspresi primer menetapkan array 1 dimensi A, operator [] mengembalikan elemen yang berada di A[0 + expression] setelah nilai dari ekspresi dikonversi ke int. Hasilnya memiliki jenis elemen dari array yang sedang diindeks. Jika ekspresi negatif, A[expression] menunjuk elemen yang terletak di A[A.Length + expression].

Saat ekspresi primer menunjuk pada array 2 dimensi B, operator [] mengembalikan elemen yang terletak di B[0 + row,0 + column] setelah nilai komponen baris dan kolom dari ekspresi (yang ditentukan sebagai daftar yang dipisahkan dengan koma) telah dikonversi ke int. Hasilnya memiliki jenis elemen dari array yang sedang diindeks. Tidak seperti array 1 dimensi, posisi negatif tidak memiliki arti khusus.

Saat ekspresi primer menunjuk array tiga dimensi atau lebih, aturan untuk array 2 dimensi berlaku dan posisi dimensi ditentukan sebagai daftar nilai yang dipisahkan koma.

Jika dicoba untuk melakukan akses baca pada elemen yang tidak ada, hasilnya $null. Menulis ke elemen yang tidak ada merupakan kesalahan.

Untuk ekspresi subskrip array multidimensi, urutan evaluasi dari ekspresi posisi dimensi tidak ditetapkan. Misalnya, diberikan array tiga dimensi $a, perilaku $a[$i++,$i,++$i] belum ditentukan.

Jika ekspresi adalah array, lihat §7.1.4.5.

Operator ini dibiarkan asosiatif.

Contoh:

$a = [int[]](10,20,30) # [int[]], Length 3
$a[1] # returns int 20
$a[20] # no such position, returns $null
$a[-1] # returns int 30, i.e., $a[$a.Length-1]
$a[2] = 5 # changes int 30 to int 5
$a[20] = 5 # implementation-defined behavior

$a = New-Object 'double[,]' 3,2
$a[0,0] = 10.5 # changes 0.0 to 10.5
$a[0,0]++ # changes 10.5 to 10.6

$list = ("red",$true,10),20,(1.2, "yes")
$list[2][1] # returns string "yes"

$a = @{ A = 10 },@{ B = $true },@{ C = 123.45 }
$a[1]["B"] # $a[1] is a Hashtable, where B is a key

$a = "red","green"
$a[1][4] # returns string "n" from string in $a[1]

Jika terjadi percobaan mengakses tulis pada elemen yang tidak ada, maka pengecualian IndexOutOfRange akan dimunculkan.

7.1.4.2 Penyubskripan pada string

Deskripsi:

Saat ekspresi utama menetapkan string S, operator [] mengembalikan karakter yang terletak di posisi berbasis nol yang ditunjukkan oleh ekspresi , sebagai char. Jika ekspresi lebih besar dari atau sama dengan panjang string tersebut, hasilnya adalah . Jika ekspresi negatif, S[expression] menunjuk elemen yang terletak di S[S.Length + expression].

Contoh:

$s = "Hello"   # string, Length 5, positions 0-4
$c = $s[1]     # returns "e" as a string
$c = $s[20]    # no such position, returns $null
$c = $s[-1]    # returns "o", i.e., $s[$s.Length-1]

7.1.4.3 Penyusunan Indeks pada Hashtable

Deskripsi:

Saat ekspresi primer menunjuk ke Hashtable, operator [] akan mengembalikan nilai yang terkait dengan kunci-kunci yang ditunjuk oleh ekspresi . Jenis ekspresi tidak dibatasi.

Ketika ekspresi adalah nama kunci tunggal, hasilnya adalah nilai terkait dan memiliki jenis tersebut, kecuali tidak ada kunci seperti itu, dalam hal ini, hasilnya $null. Jika $null digunakan sebagai kunci, perilakunya ditentukan oleh implementasi. Jika ekspresi adalah array nama kunci, lihat §7.1.4.5.

Jika ekspresi adalah array, lihat §7.1.4.5.

Contoh:

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1['FirstName']     # the value associated with key FirstName
$h1['BirthDate']     # no such key, returns $null

$h1 = @{ 10 = "James"; 20.5 = "Anderson"; $true = 123 }
$h1[10]              # returns value "James" using key 10
$h1[20.5]            # returns value "Anderson" using key 20.5
$h1[$true]           # returns value 123 using key $true

Saat ekspresi adalah nama kunci tunggal, jika $null digunakan sebagai satu-satunya nilai untuk subskrip Hashtable, pengecualian NullArrayIndex terjadi.

7.1.4.4 Subscripting dokumen XML

Deskripsi:

Saat ekspresi utama menunjuk objek jenis xml, ekspresi dikonversi ke string, jika perlu, dan operator [] mengembalikan elemen turunan pertama yang memiliki nama yang ditentukan oleh ekspresi . Jenis ekspresi harus berupa string. Jenis hasilnya ditentukan implementasinya. Hasilnya dapat di-subskrip untuk mengembalikan elemen turunan pertamanya. Jika tidak ada elemen anak dengan nama yang ditentukan oleh ekspresi , hasilnya adalah $null. Hasilnya tidak menunjukkan lokasi yang dapat ditulis.

Contoh:

$x = [xml]@"
<Name>
<FirstName>Mary</FirstName>
<LastName>King</LastName>
</Name>
"@

$x['Name']                # refers to the element Name
$x['Name']['FirstName']   # refers to the element FirstName within Name
$x['FirstName']           # No such child element at the top level, result is $null

Jenis hasilnya adalah System.Xml.XmlElement atau System.String.

7.1.4.5 Menghasilkan irisan array

Saat ekspresi primer menunjuk objek berjenis yang dapat dienumerasi (§4) atau Hashtable, dan ekspresi adalah array 1 dimensi, hasilnya adalah irisan array (§9.9) yang mengandung elemen dari ekspresi primer yang ditunjuk oleh elemen dari ekspresi .

Dalam kasus Hashtable, potongan array berisi nilai yang terkait dengan kunci yang disediakan, kecuali tidak ada kunci seperti itu, dalam hal ini, elemen yang sesuai adalah $null. Jika $null digunakan sebagai nama kunci apa pun, perilakunya dapat berbeda tergantung pada implementasinya.

Contoh:

$a = [int[]](30,40,50,60,70,80,90)
$a[1,3,5]                 # slice has Length 3, value 40,60,80
$a[,5]                    # slice with Length 1
$a[@()]                   # slice with Length 0
$a[-1..-3]                # slice with Length 3, value 90,80,70
$a = New-Object 'int[,]' 3,2
$a[0,0] = 10; $a[0,1] = 20; $a[1,0] = 30
$a[1,1] = 40; $a[2,0] = 50; $a[2,1] = 60
$a[(0,1),(1,0)]           # slice with Length 2, value 20,30, parens needed
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1['FirstName']          # the value associated with key FirstName
$h1['BirthDate']          # no such key, returns $null
$h1['FirstName','IDNum']  # returns [Object[]], Length 2 (James/123)
$h1['FirstName','xxx']    # returns [Object[]], Length 2 (James/$null)
$h1[$null,'IDNum']        # returns [Object[]], Length 2 ($null/123)

Windows PowerShell: Saat ekspresi adalah koleksi dua atau lebih nama kunci, jika $null digunakan sebagai nama kunci apa pun, kunci tersebut diabaikan dan tidak memiliki elemen yang sesuai dalam array yang dihasilkan.

7.1.5 Operator penambahan dan pengurangan postfix

Sintaksis:

post-increment-expression:
    primary-expression ++

post-decrement-expression:
    primary-expression dashdash

Deskripsi:

ekspresi primer harus menunjuk lokasi yang dapat ditulis yang memiliki nilai jenis numerik (§4) atau nilai $null. Jika nilai yang ditunjuk oleh operand adalah $null, nilai tersebut dikonversi ke tipe int dan menjadi nilai nol sebelum operator tersebut dievaluasi. Jenis nilai yang ditunjuk oleh ekspresi primer dapat berubah saat hasilnya disimpan. Lihat §7.11 untuk diskusi perubahan jenis melalui penugasan.

Hasil yang dihasilkan oleh operator ++ postfix adalah nilai yang ditunjuk oleh operand. Setelah hasil tersebut diperoleh, nilai yang ditunjuk oleh operand dinaikkan sebanyak 1 sesuai dengan jenis yang tepat. Jenis hasil ekspresi E++ sama dengan untuk hasil ekspresi E + 1 (§7,7).

Hasil yang dihasilkan oleh operator -- postfix adalah nilai yang ditunjuk oleh operand. Setelah hasil tersebut diperoleh, nilai yang ditunjuk oleh operand diturunkan oleh 1 dari jenis yang sesuai. Jenis hasil ekspresi E-- sama dengan untuk hasil ekspresi E - 1 (§7,7).

Operator ini dibiarkan asosiatif.

Contoh:

$i = 0                # $i = 0
$i++                  # $i is incremented by 1
$j = $i--             # $j takes on the value of $i before the decrement

$a = 1,2,3
$b = 9,8,7
$i = 0
$j = 1
$b[$j--] = $a[$i++]   # $b[1] takes on the value of $a[0], then $j is
                      # decremented, $i incremented

$i = 2147483647       # $i holds a value of type int
$i++                  # $i now holds a value of type double because
                      # 2147483648 is too big to fit in type int

[int]$k = 0           # $k is constrained to int
$k = [int]::MaxValue  # $k is set to 2147483647
$k++                  # 2147483648 is too big to fit, imp-def behavior

$x = $null            # target is unconstrained, $null goes to [int]0
$x++                  # value treated as int, 0->1

7.1.6 operator $(...)

Sintaksis:

sub-expression:
    $( new-lines~opt~ statement-list~opt~ new-lines~opt~ )

Deskripsi:

Jika daftar pernyataan dihilangkan, hasilnya adalah $null. Jika tidak, daftar pernyataan dievaluasi. Setiap objek yang ditulis ke alur sebagai bagian dari evaluasi dikumpulkan dalam array 1 dimensi yang tidak dibatasi, secara berurutan. Jika array objek yang dikumpulkan kosong, hasilnya adalah $null. Jika array objek yang dikumpulkan berisi satu elemen, hasilnya adalah elemen tersebut; jika tidak, hasilnya adalah array 1 dimensi yang tidak dibatasi dari hasil yang dikumpulkan.

Contoh:

$j = 20
$($i = 10) # pipeline gets nothing
$(($i = 10)) # pipeline gets int 10
$($i = 10; $j) # pipeline gets int 20
$(($i = 10); $j) # pipeline gets [Object[]](10,20)
$(($i = 10); ++$j) # pipeline gets int 10
$(($i = 10); (++$j)) # pipeline gets [Object[]](10,22)
$($i = 10; ++$j) # pipeline gets nothing
$(2,4,6) # pipeline gets [Object[]](2,4,6)

7.1.7 operator @(...)

Sintaksis:

array-expression:
    @( new-lines~opt~ statement-list~opt~ new-lines~opt~ )

Deskripsi:

Jika daftar pernyataan dihilangkan, hasilnya adalah array 1 dimensi yang tidak dibatasi dengan panjang nol. Jika tidak, daftar pernyataan dievaluasi, dan objek apa pun yang ditulis ke alur sebagai bagian dari evaluasi dikumpulkan dalam array satu dimensi yang tidak dibatasi, dalam urutan. Hasilnya adalah array 1 dimensi yang tidak dibatasi (mungkin kosong).

Contoh:

$j = 20
@($i = 10)             # 10 not written to pipeline, result is array of 0
@(($i = 10))           # pipeline gets 10, result is array of 1
@($i = 10; $j)         # 10 not written to pipeline, result is array of 1
@(($i = 10); $j)       # pipeline gets 10, result is array of 2
@(($i = 10); ++$j)     # pipeline gets 10, result is array of 1
@(($i = 10); (++$j))   # pipeline gets both values, result is array of 2
@($i = 10; ++$j)       # pipeline gets nothing, result is array of 0

$a = @(2,4,6)          # result is array of 3
@($a)                  # result is the same array of 3
@(@($a))               # result is the same array of 3

7.1.8 Ekspresi blok skrip

Sintaksis:

script-block-expression:
    { new-lines~opt~ script-block new-lines~opt~ }

script-block:
    param-block~opt~ statement-terminators~opt~ script-block-body~opt~

script-block-body:
    named-block-list
    statement-list

Deskripsi:

blok parameter dijelaskan dalam §8.10.9. daftar blokir bernama dijelaskan dalam §8.10.7.

Blok skrip adalah blok pernyataan yang tidak disebutkan namanya yang dapat digunakan sebagai satu unit. Blok skrip dapat digunakan untuk memanggil blok kode seolah-olah itu adalah satu perintah, atau dapat ditetapkan ke variabel yang dapat dijalankan.

daftar blok bernama atau daftar pernyataan dijalankan, dan jenis serta nilai hasilnya adalah jenis dan nilai dari hasil-hasil kumpulan pernyataan tersebut.

Ekspresi blok skrip memiliki jenis blok skrip (§4.3.7).

Jika blok param dihilangkan, argumen apa pun yang diteruskan ke blok skrip tersedia melalui (§8.10.1).

Selama pengikatan parameter, blok skrip dapat diteruskan baik sebagai objek blok skrip atau sebagai hasilnya setelah blok skrip dievaluasi. Lihat §6.17 untuk informasi lebih lanjut.

7.1.9 Ekspresi harfiah hash

Sintaksis:

hash-literal-expression:
    @{ new-lines~opt~ hash-literal-body~opt~ new-lines~opt~ }

hash-literal-body:
    hash-entry
    hash-literal-body statement-terminators hash-entry

hash-entry:
    key-expression = new-lines~opt~ statement

key-expression:
    simple-name
    unary-expression

statement-terminators:
    statement-terminator
    statement-terminators statement-terminator

statement-terminator:
    ;
    new-line-character

Deskripsi:

ekspresi hash-literal digunakan untuk membuat Hashtable (§10) dari nol atau lebih elemen yang masing-masing merupakan pasangan kunci/nilai.

Kunci mungkin memiliki jenis apa pun kecuali jenis null. Nilai terkait mungkin memiliki jenis apa pun, termasuk jenis null, dan masing-masing nilai tersebut mungkin ekspresi apa pun yang menunjuk nilai yang diinginkan, termasuk $null.

Urutan pasangan kunci/nilai tidak signifikan.

Contoh:

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$last = "Anderson"; $IDNum = 120
$h2 = @{ FirstName = "James"; LastName = $last; IDNum = $IDNum + 3 }
$h3 = @{ }
$h4 = @{ 10 = "James"; 20.5 = "Anderson"; $true = 123 }

yang membuat dua Hashtable, $h1 dan $h2, masing-masing berisi tiga pasangan kunci/nilai, dan yang ketiga, $h3, yang kosong. Hashtable $h4 memiliki kunci dari berbagai jenis.

7.1.10 Jenis ekspresi harfiah

Sintaksis:

type-literal:
    [ type-spec ]

type-spec:
    array-type-name new-lines~opt~ dimension~opt~ ]
    generic-type-name new-lines~opt~ generic-type-arguments ]
    type-name

dimension:
    ,
    dimension ,

generic-type-arguments:
    type-spec new-lines~opt~
    generic-type-arguments , new-lines~opt~ type-spec

array-type-name:
    type-name [

generic-type-name:
    type-name [

Deskripsi:

jenis harfiah diwakili dalam implementasi oleh beberapa jenis mendasar yang tidak ditentukan. Akibatnya, nama jenis adalah sinonim untuk jenis yang mendasarinya.

Jenis literal digunakan dalam sejumlah konteks:

  • Menentukan konversi eksplisit (§6, §7.2.9)
  • Membuat array yang dibatasi jenis (§9,4)
  • Mengakses anggota statis objek (§7.1.2)
  • Menentukan batasan jenis pada variabel (§5,3) atau parameter fungsi (§8.10.2)

Contoh:

[int].IsPrimitive        # $true
[Object[]].FullName      # "System.Object[]"
[int[,,]].GetArrayRank() # 3

Jenis tumpukan generik (§4,4) yang dikhususkan untuk menyimpan string mungkin ditulis sebagai [Stack[string]], dan jenis kamus generik yang dikhususkan untuk menyimpan kunci int dengan nilai string terkait mungkin ditulis sebagai [Dictionary[int,string]].

Jenis literal jenis adalah . Nama lengkap untuk jenis Stack[string] yang disarankan di atas adalah System.Collections.Generic.Stack[int]. Nama lengkap untuk jenis Dictionary[int,string] yang disarankan di atas adalah System.Collections.Generic.Dictionary[int,string].

7.2 Operator unary

Sintaksis:

unary-expression:
    primary-expression
    expression-with-unary-operator

expression-with-unary-operator:
    , new-lines~opt~ unary-expression
    -not new-lines~opt~ unary-expression
    ! new-lines~opt~ unary-expression
    -bnot new-lines~opt~ unary-expression
    + new-lines~opt~ unary-expression
    dash new-lines~opt~ unary-expression
    pre-increment-expression
    pre-decrement-expression
    cast-expression
    -split new-lines~opt~ unary-expression
    -join new-lines~opt~ unary-expression

pre-increment-expression:
    ++ new-lines~opt~ unary-expression

pre-decrement-expression:
    dashdash new-lines~opt~ unary-expression

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

cast-expression:
    type-literal unary-expression

dashdash:
    dash dash

7.2.1 Operator koma unaeri

Deskripsi:

Operator koma (,) membuat array satu dimensi yang tidak dibatasi dan memiliki satu elemen, yang jenis dan nilainya adalah ekspresi unari.

Operator ini bersifat asosiatif kanan.

Contoh:

$a = ,10         # create an unconstrained array of 1 element, $a[0],
                 # which has type int

$a = ,(10,"red") # create an unconstrained array of 1 element,
$a[0],
                 # which is an unconstrained array of 2 elements,
                 # $a[0][0] an int, and $a[0][1] a string

$a = ,,10        # create an unconstrained array of 1 element, which is
                 # an unconstrained array of 1 element, which is an int
                 # $a[0][0] is the int. Contrast this with @(@(10))

7.2.2 Logika NOT

Sintaksis:

logical-not-operator:
    dash not

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -not mengonversi nilai yang ditunjuk oleh unary-expression menjadi type bool (§6,2), jika perlu, dan menghasilkan hasil dari jenis tersebut. Jika nilai unary-expression adalah True, hasilnya adalah False, dan sebaliknya. Operator ! adalah ejaan alternatif untuk -not.

Operator ini bersifat asosiatif kanan.

Contoh:

-not $true         # False
-not -not $false   # False
-not 0             # True
-not 1.23          # False
!"xyz"             # False

7.2.3 Bitwise TIDAK

Sintaksis:

bitwise-not-operator:
    dash bnot

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -bnot mengonversi nilai yang ditunjuk oleh ekspresi unary menjadi jenis bilangan bulat (§6,4), jika perlu. Jika nilai yang dikonversi dapat diwakili dalam jenis int maka itu adalah jenis hasilnya. Jika tidak, jika nilai yang dikonversi dapat diwakili dalam tipe long maka tipe hasilnya adalah demikian. Jika tidak, ekspresinya salah bentuk. Nilai yang dihasilkan adalah pelengkap ones dari nilai yang dikonversi.

Operator ini bersifat asosiatif kanan.

Contoh:

-bnot $true         # int with value 0xFFFFFFFE
-bnot 10            # int with value 0xFFFFFFF5
-bnot 2147483648.1  # long with value 0xFFFFFFFF7FFFFFFF
-bnot $null         # int with value 0xFFFFFFFF
-bnot "0xabc"       # int with value 0xFFFFF543

7.2.4 Unary plus

Deskripsi:

Ekspresi formulir + unary-expression diperlakukan seolah-olah ditulis sebagai 0 + unary-expression (§7,7). Bilangan bulat harfiah 0 memiliki jenis int.

Operator ini bersifat asosiatif kanan.

Contoh:

+123L         # type long, value 123
+0.12340D     # type decimal, value 0.12340
+"0xabc"      # type int, value 2748

7.2.5 Minus unari

Deskripsi:

Ekspresi formulir - unary-expression diperlakukan seolah-olah ditulis sebagai 0 - unary-expression (§7,7). Bilangan bulat literal 0 memiliki jenis int. Operator minus dapat berupa salah satu karakter tanda hubung yang tercantum dalam §7,2.

Operator ini bersifat asosiatif kanan.

Contoh:

-$true     # type int, value -1
-123L      # type long, value -123
-0.12340D  # type decimal, value -0.12340

7.2.6 Prefiks kenaikan dan operator penurunan

Deskripsi:

unary-expression harus merujuk pada lokasi yang dapat ditulis yang memiliki nilai jenis numerik (§4) atau nilai $null. Jika nilai yang ditunjuk oleh ekspresi-unary adalah , nilai dari ekspresi-unarydikonversi ke tipe int dan nilai nol sebelum operator dievaluasi.

Nota

Jenis nilai yang ditunjuk oleh unary-expression dapat berubah saat hasilnya disimpan. Lihat §7.11 untuk diskusi perubahan jenis melalui penugasan.

Untuk operator peningkatan awalan ++, nilai unary-expression dinaikkan sebanyak 1 dari jenis yang sesuai. Hasilnya adalah nilai baru setelah penaikan terjadi. Ekspresi ++E setara dengan E += 1 (§7.11.2).

Untuk operator pengurangan awalan -- , nilai unary-expression dikurangi oleh 1 dari jenis yang sesuai. Hasilnya adalah nilai baru setelah penurunan terjadi. Ekspresi --E setara dengan E -= 1 (§7.11.2). Operator penurunan awalan dapat berupa salah satu pola yang cocok dengan pola dashdash dalam §7.2.

Operator ini tepat asosiatif.

Contoh:

$i = 0                # $i = 0
++$i                  # $i is incremented by 1
$j = --$i             # $i is decremented then $j takes on the value of $i

$a = 1,2,3
$b = 9,8,7
$i = 0;
$j = 1
$b[--$j] = $a[++$i]   # $j is # decremented, $i incremented, then $b[0]
                      # takes on the value of $a[1]

$i = 2147483647       # $i holds a value of type int
++$i                  # $i now holds a value of type double because
                      # 2147483648 is too big to fit in type int

[int]$k = 0           # $k is constrained to int
$k = [int]::MinValue  # $k is set to -2147483648
--$k                  # -2147483649 is too small to fit, imp-def behavior

$x = $null            # target is unconstrained, $null goes to [int]0
--$x                  # value treated as int, 0 becomes -1

7.2.7 Operator unary -join

Sintaksis:

join-operator:
    dash join

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -join unary menghasilkan string yang merupakan perangkaian nilai satu atau beberapa objek yang ditunjuk oleh unary-expression. (Pemisah dapat dimasukkan dengan menggunakan versi biner operator ini (§7.8.4.4).)

ekspresi-uner dapat berupa nilai skalar atau kumpulan.

Contoh:

-join (10, 20, 30)             # result is "102030"
-join (123, $false, 19.34e17)  # result is "123False1.934E+18"
-join 12345                    # result is "12345"
-join $null                    # result is ""

7.2.8 Operator unari -split

Sintaksis:

split-operator:
    dash split

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -split unary membagi satu atau beberapa string yang ditunjuk oleh unary-expression , mengembalikan subbagiannya dalam array string 1 dimensi yang dibatasi. Ini memperlakukan sekelompok karakter spasi putih yang berdekatan sebagai pemisah antara subbagian berturut-turut. String pemisah eksplisit dapat ditentukan dengan menggunakan versi biner operator ini (§7.8.4.5) atau dua variannya (§7,8).

Teks pemisah tidak disertakan dalam string yang dihasilkan. Spasi putih di awal dan akhir dalam string input diabaikan. String input yang kosong atau berisi spasi kosong hanya menghasilkan array dari satu string, yang kosong.

unary-expression dapat menunjuk nilai skalar atau array string.

Contoh:

-split " red`tblue`ngreen " # 3 strings: "red", "blue", "green"
-split ("yes no", "up down") # 4 strings: "yes", "no", "up", "down"
-split " " # 1 (empty) string

7.2.9 Operator pemeran

Deskripsi:

Operator ini mengonversi secara eksplisit (§6) nilai yang ditunjuk oleh ekspresi unary ke tipe yang ditunjuk oleh literal tipe (§7.1.10). Jika tipe literal adalah selain void, tipe hasilnya adalah tipe bernama, dan nilainya adalah nilai setelah konversi. Jika tipe literal adalah void, tidak ada objek yang ditulis ke alur dan tidak ada hasil.

Saat ekspresi jenis apa pun diubah ke jenis yang sama, jenis dan nilai yang dihasilkan adalah jenis dan nilai dari ekspresi-uner .

Operator ini bersifat asosiatif kanan.

Contoh:

[bool]-10        # a bool with value True
[int]-10.70D     # a decimal with value -10
[int]10.7        # an int with value 11
[long]"+2.3e+3"  # a long with value 2300
[char[]]"Hello"  # an array of 5 char with values H, e, l, l, and o.

7.3 Operator koma dalam konteks biner

Sintaksis:

array-literal-expression:
    unary-expression , new-lines~opt~ array-literal-expression

Deskripsi:

Operator koma biner menghasilkan array satu dimensi yang elemennya adalah nilai yang ditentukan oleh operannya, dalam urutan leksikografis. Array memiliki jenis yang tidak dibatasi.

Contoh:

2,4,6                    # Length 3; values 2,4,6
(2,4),6                  # Length 2; values [Object[]],int
(2,4,6),12,(2..4)        # Length 3; [Object[]],int,[Object[]]
2,4,6,"red",$null,$true  # Length 6

Penambahan tanda kurung pengelompokan ke ekspresi koma biner tertentu tidak mendokumentasikan prioritas default; sebaliknya, itu mengubah hasilnya.

Operator Rentang 7.4

Sintaksis:

range-expression:
    unary-expression .. new-lines~opt~ unary-expression

Deskripsi:

Ekspresi rentang membuat array satu dimensi yang tidak dibatasi, yang elemennya adalah nilai-nilai dari urutan int yang ditentukan oleh batas rentang. Nilai yang ditunjuk oleh operand dikonversi keint , jika perlu (§6,4). Operand yang menunjuk nilai yang lebih rendah setelah konversi adalah batas bawah , sementara operand yang menunjuk nilai yang lebih tinggi setelah konversi adalah batas atas . Kedua batas mungkin sama, dalam hal ini, array yang dihasilkan memiliki panjang 1. Jika operan kiri menunjuk batas bawah, urutannya dalam urutan naik. Jika operand kiri menunjuk batas atas, urutannya berada dalam urutan menurun.

Secara konseptual, operator ini adalah pintasan untuk urutan operator koma biner yang sesuai. Misalnya, rentang 5..8 juga dapat dihasilkan menggunakan 5,6,7,8. Namun, jika urutan naik atau turun diperlukan tanpa harus menggunakan array, implementasi dapat menghindari pembuatan array yang sebenarnya. Misalnya, dalam foreach ($i in 1..5) { ... }, tidak ada array yang perlu dibuat.

ekspresi rentang dapat digunakan untuk menentukan irisan array (§9.9).

Contoh:

1..10        # ascending range 1..10
-495..-500   # descending range -495..-500
16..16       # sequence of 1

$x = 1.5
$x..5.40D    # ascending range 2..5

$true..3     # ascending range 1..3
-2..$null    # ascending range -2..0
0xf..0xa     # descending range 15..10

Format operator 7.5

Sintaksis:

format-expression:
    format-specification-string format-operator new-lines~opt~ range-expression

format-operator:
    dash f

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Ekspresi format memformat satu atau beberapa nilai yang ditunjuk oleh ekspresi rentang sesuai dengan string-spesifikasi-format yang ditunjuk oleh ekspresi format. Posisi nilai yang ditunjuk oleh ekspresi rentang dinomor mulai dari nol dan meningkat dalam urutan leksikal. Hasilnya memiliki jenis string.

String spesifikasi format dapat berisi nol atau lebih spesifikasi format, yang masing-masing memiliki bentuk sebagai berikut:

{N [ ,M ][ : FormatString ]}

N mewakili posisi nilai ekspresi rentang, M menunjukkan lebar tampilan minimum (opsional), dan FormatString menunjukkan format (opsional). Jika lebar nilai yang diformat melebihi lebar yang ditentukan, lebar akan ditingkatkan sesuai. Nilai yang posisinya tidak dirujuk dalam FormatString diabaikan setelah dievaluasi untuk efek samping apa pun. Jika N mengacu pada posisi yang tidak ada, perilaku tersebut tergantung pada definisi implementasi. Nilai jenis $null dan kekosongan diformat sebagai string kosong. Array diformat sebagai untuk sub-ekspresi (§7.1.6). Untuk menyertakan karakter { dan } dalam spesifikasi format tanpa ditafsirkan sebagai pembatas format, tulis sebagai {{ dan }}, masing-masing.

Untuk definisi lengkap spesifikasi format, lihat jenis System.IFormattable di Ecma Technical Report TR/84.

Contoh:

"__{0,3}__" -f 5                         # __ 5__
"__{0,-3}__" -f 5                        # __5 __
"__{0,3:000}__" -f 5                     # __005__
"__{0,5:0.00}__" -f 5.0                  # __ 5.00__
"__{0:C}__" -f 1234567.888               # __$1,234,567.89__
"__{0:C}__" -f -1234.56                  # __($1,234.56)__
"__{0,12:e2}__" -f 123.456e2             # __ 1.23e+004__
"__{0,-12:p}__" -f -0.252                # __-25.20 % __

$i = 5; $j = 3
"__{0} + {1} <= {2}__" -f $i,$j,($i+$j)  # __5 + 3 <= 8__

$format = "__0x{0:X8}__"
$format -f 65535                         # __0x0000FFFF__

Dalam spesifikasi format, jika N mengacu pada posisi yang tidak ada, FormatError dinaikkan.

7.6 Operator multiplikatif

Sintaksis:

multiplicative-expression:
    multiplicative-expression * new-lines~opt~ format-expression
    multiplicative-expression / new-lines~opt~ format-expression
    multiplicative-expression % new-lines~opt~ format-expression

7.6.1 Perkalian

Deskripsi:

Hasil dari operator perkalian * adalah hasil kali dari nilai-nilai yang ditunjukkan oleh kedua operan setelah diberlakukannya konversi aritmatika biasa (§6.15).

Operator ini dibiarkan asosiatif.

Contoh:

12 * -10L      # long result -120
-10.300D * 12  # decimal result -123.600
10.6 * 12      # double result 127.2
12 * "0xabc"   # int result 32976

7.6.2 Replikasi Untai

Deskripsi:

Ketika operand kiri menunjuk sebuah string, operator biner * membuat string baru yang mengandung string yang ditunjuk oleh operand kiri direplikasi berapa kali ditentukan oleh nilai operand kanan yang telah dikonversi ke jenis bilangan bulat (§6.4).

Operator ini dibiarkan asosiatif.

Contoh:

"red" * "3"       # string replicated 3 times
"red" * 4         # string replicated 4 times
"red" * 0         # results in an empty string
"red" * 2.3450D   # string replicated twice
"red" * 2.7       # string replicated 3 times

7.6.3 Replikasi array

Deskripsi:

Ketika operand kiri menunjuk array, operator biner * membuat array 1 dimensi baru yang tidak dibatasi yang berisi nilai yang ditunjuk oleh operand kiri, dan nilai tersebut akan direplikasi sebanyak jumlah yang ditentukan oleh nilai operand kanan setelah dikonversi ke jenis bilangan bulat (§6.4). Jumlah replikasi nol menghasilkan array dengan panjang 1. Jika operan kiri menunjuk array multidimensional, itu diratakan (§9.12) sebelum digunakan.

Operator ini dibiarkan asosiatif.

Contoh:

$a = [int[]](10,20)              # [int[]], Length 2*1
$a * "3"                         # [Object[]], Length 2*3
$a * 4                           # [Object[]], Length 2*4
$a * 0                           # [Object[]], Length 2*0
$a * 2.3450D                     # [Object[]], Length 2*2
$a * 2.7                         # [Object[]], Length 2*3
(New-Object 'float[,]' 2,3) * 2  # [Object[]], Length 2*2

7.6.4 Divisi

Deskripsi:

Hasil dari operator divisi / adalah kuota ketika nilai yang ditunjuk oleh operand kiri dibagi dengan nilai yang ditunjuk oleh operand kanan setelah konversi aritmatika biasa (§6,15) telah diterapkan.

Jika upaya dilakukan untuk melakukan pembagian bilangan bulat atau desimal dengan nol, kesalahan penghentian yang ditentukan implementasi akan muncul.

Operator ini dibiarkan asosiatif.

Contoh:

10/-10      # int result -1
12/-10      # double result -1.2
12/-10D     # decimal result 1.2
12/10.6     # double result 1.13207547169811
12/"0xabc"  # double result 0.00436681222707424

Jika upaya dilakukan untuk melakukan pembagian bilangan bulat atau desimal dengan nol, pengecualian RuntimeException dilemparkan.

7.6.5 Sisanya

Deskripsi:

Hasil dari operator sisa % adalah sisanya ketika nilai yang ditunjuk oleh operand kiri dibagi dengan nilai yang ditunjuk oleh operand kanan setelah konversi aritmatika biasa (§6,15) telah diterapkan.

Jika upaya dilakukan untuk melakukan pembagian bilangan bulat atau desimal dengan nol, kesalahan penghentian yang ditentukan implementasi akan muncul.

Contoh:

10 % 3          # int result 1
10.0 % 0.3      # double result 0.1
10.00D % "0x4"  # decimal result 2.00

Jika upaya dilakukan untuk melakukan pembagian bilangan bulat atau desimal dengan nol, pengecualian RuntimeException dilemparkan.

7.7 Operator aditif

Sintaksis:

additive-expression:
    primary-expression + new-lines~opt~ expression
    primary-expression dash new-lines~opt~ expression

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

7.7.1 Penambahan

Deskripsi:

Hasil dari operator penambahan + adalah jumlah nilai yang ditunjukkan oleh dua operan setelah konversi aritmatika biasa (§6.15) diterapkan.

Operator ini dibiarkan asosiatif.

Contoh:

12 + -10L       # long result 2
-10.300D + 12   # decimal result 1.700
10.6 + 12       # double result 22.6
12 + "0xabc"    # int result 2760

7.7.2 Perangkaian string

Deskripsi:

Ketika operand kiri menunjuk string, operator biner + membuat string baru yang berisi nilai yang ditunjuk oleh operand kiri, langsung diikuti oleh nilai yang ditunjuk oleh operand kanan yang telah dikonversi ke tipe string (§6.8).

Operator ini dibiarkan asosiatif.

Contoh:

"red" + "blue"      # "redblue"
"red" + "123"       # "red123"
"red" + 123         # "red123"
"red" + 123.456e+5  # "red12345600"
"red" + (20,30,40)  # "red20 30 40"

7.7.3 Perangkaian array

Deskripsi:

Ketika operand kiri menunjuk array, operator + biner membuat sebuah array 1 dimensi baru yang tidak dibatasi yang berisi elemen-elemen yang ditunjuk oleh operand kiri, diikuti langsung oleh nilai-nilai yang ditunjuk oleh operand kanan. Array multidmensional yang ada di salah satu operand diratakan (§9,12) sebelum digunakan.

Operator ini dibiarkan asosiatif.

Contoh:

$a = [int[]](10,20)               # [int[]], Length 2
$a + "red"                        # [Object[]], Length 3
$a + 12.5,$true                   # [Object[]], Length 4
$a + (New-Object 'float[,]' 2,3)  # [Object[]], Length 8
(New-Object 'float[,]' 2,3) + $a  # [Object[]], Length 8

7.7.4 Penggabungan Hashtable

Deskripsi:

Ketika kedua operan menunjuk Hashtables operator biner + membuat Hashtable baru yang berisi elemen yang ditunjuk oleh operand kiri diikuti segera oleh elemen yang ditunjuk oleh operand kanan.

Jika Hashtable berisi kunci yang sama, kesalahan penghentian yang ditentukan implementasi akan dimunculkan.

Operator ini dibiarkan asosiatif.

Contoh:

$h1 = @{ FirstName = "James"; LastName = "Anderson" }
$h2 = @{ Dept = "Personnel" }
$h3 = $h1 + $h2      # new Hashtable, Count = 3

Jika Hashtables berisi kunci yang sama, pengecualian jenis BadOperatorArgument dilemparkan.

7.7.5 Pengurangan

Deskripsi:

Hasil dari operator pengurangan - adalah perbedaan ketika nilai yang ditunjuk oleh operand kanan dikurangi dari nilai yang ditunjuk oleh operand kiri setelah konversi aritmatika biasa (§6,15) telah diterapkan. Operator pengurangan dapat berupa salah satu karakter tanda hubung yang tercantum dalam §7.7.

Operator ini dibiarkan asosiatif.

Contoh:

12 - -10L      # long result 22
-10.300D - 12  # decimal result -22.300
10.6 - 12      # double result -1.4
12 - "0xabc"   # int result -2736

7.8 Operator perbandingan

Sintaksis:

comparison-expression:
    primary-expression comparison-operator new-lines~opt~ expression

comparison-operator:
    equality-operator
    relational-operator
    containment-operator
    type-operator
    like-operator
    match-operator

Deskripsi:

Jenis nilai yang ditunjuk oleh operand kiri menentukan bagaimana nilai yang ditunjuk oleh operand kanan dikonversi (§6), jika perlu, sebelum perbandingan selesai.

Beberapa operator perbandingan memiliki dua varian, satu yang peka huruf besar/kecil (-c<operator>), dan yang tidak peka huruf besar/kecil (-i<operator>). Versi -<operator> setara dengan -i<operator>. Sensitivitas huruf besar/kecil hanya bermakna saat membandingkan nilai dari tipe string. Dalam konteks perbandingan non-string, kedua varian berprilaku sama.

Operator ini dibiarkan asosiatif.

7.8.1 Kesetaraan dan operator relasional

Sintaksis:

equality-operator: one of
    dash eq     dash ceq    dash ieq
    dash ne     dash cne    dash ine

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

relational-operator: one of
    dash lt     dash clt    dash ilt
    dash le     dash cle    dash ile
    dash gt     dash cgt    dash igt
    dash ge     dash cge    dash ige

Deskripsi:

Ada dua operator kesetaraan: kesetaraan (-eq) dan ketidaksetaraan (-ne); dan empat operator relasional: kurang dari (-lt), kurang dari atau sama dengan (-le), lebih besar dari (-gt), dan lebih besar dari atau sama dengan (-ge). Masing-masing memiliki dua varian (§7,8).

Agar dua string dianggap sama, string harus memiliki panjang dan konten yang sama, serta huruf besar/kecil yang sama, jika relevan.

Jika nilai yang ditunjuk oleh operand kiri bukan koleksi, hasilnya memiliki jenis bool. Jika tidak, hasilnya mungkin kosong dan tidak dibatasi, berupa array 1 dimensi yang berisi elemen-elemen dari koleksi yang bernilai True ketika dibandingkan dengan nilai yang ditunjuk oleh operand kanan.

Contoh:

10 -eq "010"           # True, int comparison
"010" -eq 10           # False, string comparison
"RED" -eq "Red"        # True, case-insensitive comparison
"RED" -ceq "Red"       # False, case-sensitive comparison
"ab" -lt "abc"         # True

10,20,30,20,10 -ne 20  # 10,30,10, Length 3
10,20,30,20,10 -eq 40  # Length 0
10,20,30,20,10 -ne 40  # 10,20,30,20,10, Length 5
10,20,30,20,10 -gt 25  # 30, Length 1
0,1,30 -ne $true       # 0,30, Length 2
0,"00" -eq "0"         # 0 (int), Length 1

7.8.2 Operator penahanan

Sintaksis:

containment-operator: one of
    dash contains       dash ccontains      dash icontains
    dash notcontains    dash cnotcontains   dash inotcontains
    dash in             dash cin            dash iin
    dash notin          dash cnotin         dash inotin

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Ada empat operator kontainmen: berisi (-contains), tidak berisi (-notcontains), masuk dalam (-in) dan tidak masuk dalam (-notin). Masing-masing memiliki dua varian (§7,8).

Operator pemeriksaan keberadaan mengembalikan hasil bertipe bool yang menunjukkan apakah suatu nilai muncul (atau tidak muncul) paling tidak sekali dalam elemen-elemen array. Dengan -contains dan -notcontains, nilai ditunjuk oleh operand kanan dan array ditunjuk oleh operand kiri. Dengan -in dan -notin, operan dibalik. Nilai ditunjuk oleh operand kiri dan array ditunjuk oleh operand kanan.

Untuk tujuan operator ini, jika operand array memiliki nilai skalar, nilai skalar dianggap sebagai array dengan satu elemen.

Contoh:

10,20,30,20,10 -contains 20     # True
10,20,30,20,10 -contains 42.9   # False
10,20,30 -contains "10"         # True
"10",20,30 -contains 10         # True
"010",20,30 -contains 10        # False
10,20,30,20,10 -notcontains 15  # True
"Red",20,30 -ccontains "RED"    # False

7.8.3 Jenis operator pengujian dan konversi

Sintaksis:

type-operator: one of
    dash is
    dash as

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator tipe -is menguji apakah nilai yang ditunjuk oleh operand kiri memiliki tipe, atau diturunkan dari tipe yang memiliki tipe, yang ditunjuk oleh operand kanan. Operand kanan harus menunjuk jenis atau nilai yang dapat dikonversi ke jenis (seperti string yang memberi nama jenis). Jenis hasilnya adalah bool. Operator jenis -isnot mengembalikan negasi logis dari formulir -is yang sesuai.

Operator jenis -as mencoba mengonversi nilai yang ditunjuk oleh operand kiri ke jenis yang ditunjuk oleh operand kanan. Operand kanan harus menunjuk jenis atau nilai yang dapat dikonversi ke jenis (seperti string yang memberi nama jenis). Jika konversi gagal, $null dikembalikan; jika tidak, nilai yang dikonversi dikembalikan dan jenis pengembalian hasil tersebut adalah jenis runtime dari nilai yang dikonversi.

Contoh:

$a = 10            # value 10 has type int
$a -is [int]       # True

$t = [int]
$a -isnot $t       # False
$a -is "int"       # True
$a -isnot [double] # True

$x = [int[]](10,20)
$x -is [int[]]     # True

$a = "abcd"        # string is derived from object
$a -is [Object]    # True

$x = [double]
foreach ($t in [int],$x,[decimal],"string") {
    $b = (10.60D -as $t) * 2  # results in int 22, double 21.2
}                             # decimal 21.20, and string "10.6010.60"

7.8.4 Pencocokan pola dan operator manipulasi teks

7.8.4.1 Operator -like dan -notlike

Sintaksis:

like-operator: one of
    dash like       dash clike      dash ilike
    dash notlike    dash cnotlike   dash inotlike

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Jika operand kiri tidak menunjuk koleksi, hasilnya memiliki jenis bool. Jika tidak, hasilnya mungkin kosong dan tidak dibatasi, berupa array 1 dimensi yang berisi elemen-elemen dari koleksi yang bernilai True ketika dibandingkan dengan nilai yang ditunjuk oleh operand kanan. Operand kanan dapat menunjuk string yang berisi ekspresi wildcard (§3.15). Operator ini memiliki dua varian (§7,8).

Contoh:

"Hello" -like "h*"                   # True, starts with h
"Hello" -clike "h*"                  # False, does not start with lowercase h
"Hello" -like "*l*"                  # True, has an l in it somewhere
"Hello" -like "??l"                  # False, no length match

"-abc" -like "[-xz]*"                # True, - is not a range separator
"#$%\^&" -notlike "*[A-Za-z]"        # True, does not end with alphabetic character
"He" -like "h[aeiou]?*"              # False, need at least 3 characters
"When" -like "*[?]"                  # False, ? is not a wildcard character
"When?" -like "*[?]"                 # True, ? is not a wildcard character

"abc","abbcde","abcgh" -like "abc*"  # object[2], values
"abc" and "abcgh"

7.8.4.2 Operator -match dan -notmatch

Sintaksis:

match-operator: one of
    dash match      dash cmatch     dash imatch
    dash notmatch   dash cnotmatch  dash inotmatch

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Jika operand kiri bukan merupakan sebuah koleksi, hasilnya memiliki tipe bool, dan jika hasil tersebut adalah $true, elemen-elemen dari Hashtable $Matches diatur menjadi string yang sesuai (atau tidak sesuai) dengan nilai yang ditentukan oleh operand kanan. Jika tidak, hasilnya adalah array 1 dimensi yang mungkin kosong dan tidak dibatasi, berisi elemen-elemen koleksi yang menghasilkan nilai Benar ketika dibandingkan dengan nilai yang ditunjukkan oleh operand di sebelah kanan, dan $Matches tidak ditetapkan. Operand kanan dapat menunjuk string yang berisi ekspresi reguler (§3,16), dalam hal ini, itu disebut sebagai pola . Operator ini memiliki dua varian (§7,8).

Operator ini mendukung sub-pertandingan (§7.8.4.6).

Contoh:

"Hello" -match ".l"                    # True, $Matches key/value is 0/"el"
"Hello" -match '\^h.*o$'               # True, $Matches key/value is
0/"Hello"
"Hello" -cmatch '\^h.*o$'              # False, $Matches not set
"abc\^ef" -match ".\\\^e"              # True, $Matches key/value is 0/"c\^e"

"abc" -notmatch "[A-Za-z]"             # False
"abc" -match "[\^A-Za-z]"              # False
"He" -match "h[aeiou]."                # False, need at least 3 characters
"abc","abbcde","abcgh" -match "abc.*"  # Length is 2, values "abc", "abcgh"

7.8.4.3 Operator -replace

Sintaksis:

binary-replace-operator: one of
    dash replace    dash creplace   dash ireplace

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -replace memungkinkan penggantian teks dalam satu atau beberapa string yang ditunjuk oleh operand kiri menggunakan nilai yang ditunjuk oleh operand kanan. Operator ini memiliki dua varian (§7,8). Operand kanan memiliki salah satu bentuk berikut:

  • String yang akan ditemukan, yang mungkin berisi ekspresi reguler (§3.16). Dalam hal ini, string pengganti secara implisit "".
  • Array yang terdiri dari 2 objek yang berisi string yang ingin ditemukan, diikuti oleh string pengganti.

Jika operand kiri berupa string, maka hasilnya akan bertipe string. Jika operand kiri menunjuk array string 1 dimensi, hasilnya adalah array 1 dimensi yang tidak dibatasi, yang panjangnya sama dengan array operand kiri, yang berisi string input setelah penggantian selesai.

Operator ini mendukung subcocok (§7.8.4.6).

Contoh:

"Analogous","an apple" -replace "a","*"      # "*n*logous","*n *pple"
"Analogous" -creplace "[aeiou]","?"          # "An?l?g??s"
"Analogous","an apple" -replace '\^a',"%%A"  # "%%Analogous","%%An apple"
"Analogous" -replace "[aeiou]",'$&$&'        # "AAnaaloogoouus"

7.8.4.4 Operator biner -join

Sintaksis:

binary-join-operator: one of
    dash join

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -join biner menghasilkan string yang merupakan perangkaian nilai satu atau beberapa objek yang ditunjuk oleh operand kiri setelah dikonversi menjadi string (§6,7), jika perlu. String yang ditunjuk oleh operand kanan digunakan untuk memisahkan nilai (mungkin kosong) dalam string yang dihasilkan.

Operand kiri dapat berupa angka skalar atau koleksi data.

Contoh:

(10, 20, 30) -join "\|"    # result is "10\|20\|30"
12345 -join ","            # result is "12345", no separator needed
($null,$null) -join "<->"  # result is "<->", two zero-length values

7.8.4.5 Operator -split biner

Sintaksis:

binary-split-operator: one of
    dash split      dash csplit     dash isplit

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator -split biner membagi satu atau beberapa string yang ditunjuk oleh operand kiri, mengembalikan subbagiannya dalam array string 1 dimensi yang dibatasi. Operator ini memiliki dua varian (§7,8). Operand kiri dapat menunjukkan nilai skalar atau array yang berisi string. Operand kanan memiliki salah satu bentuk berikut:

  • Rangkaian pemisah
  • Sebuah array yang berisi 2 objek di mana setiap objek mengandung string pembatas yang diikuti dengan jumlah pembagian numerik .
  • Array dari 3 objek yang berisi string pembatas, jumlah pemisahan numerik, dan string opsi
  • Blok naskah
  • Array dari 2 objek yang berisi blok skrip diikuti dengan hitung pemisahan numerik

String pemisah mungkin berisi ekspresi reguler (§3,16). Ini digunakan untuk menemukan subpart dengan string input. Pemisah tidak disertakan dalam string yang dihasilkan. Jika operand kiri menunjuk string kosong, yang menghasilkan elemen string kosong. Jika string pemisah adalah string kosong, string tersebut ditemukan di setiap posisi karakter dalam string input.

Secara default, semua subbagian string input ditempatkan ke dalam hasil sebagai elemen terpisah; namun, jumlah pemisahan dapat digunakan untuk memodifikasi perilaku ini. Jika jumlah tersebut negatif, nol, atau lebih besar dari atau sama dengan jumlah subpart dalam string input, setiap subpart masuk ke elemen terpisah. Jika jumlah tersebut kurang dari jumlah subbagian dalam string input, ada elemen hitungan dalam hasilnya, dengan elemen akhir yang berisi semua subbagian di luar jumlah pertama - 1 subbagian.

String opsi berisi nol atau lebih nama opsi dengan setiap pasangan yang berdekatan dipisahkan oleh koma. Spasi kosong di awal, di akhir, dan di tengah diabaikan. Nama opsi bisa dalam urutan apa pun dan peka terhadap huruf besar/kecil.

Jika string opsi berisi nama opsi SimpleMatch, string tersebut mungkin juga berisi nama opsi IgnoreCase. Jika string opsi berisi nama opsi RegexMatch atau tidak berisi RegexMatch atau SimpleMatch, mungkin berisi nama opsi apa pun kecuali SimpleMatch. Namun, tidak boleh berisi Multiline dan Singleline.

Berikut adalah kumpulan nama opsi:

Opsi Deskripsi
Tidak Dipengaruhi Budaya Mengabaikan perbedaan budaya dalam bahasa saat mengevaluasi pemisah.
ExplicitCapture Mengabaikan grup kecocokan yang tidak dinamai sehingga hanya grup penangkapan eksplisit yang dihasilkan dalam daftar hasil.
IgnoreCase Memaksa pencocokan tidak peka huruf besar/kecil, bahkan jika -csplit digunakan.
IgnorePatternWhitespace Mengabaikan spasi kosong dan komentar yang tidak dilewati yang ditandai dengan tanda angka (#).
Multibaris Mode ini mengenali awal dan akhir baris dan string. Mode defaultnya adalah Singleline.
RegexMatch Gunakan pencocokan ekspresi reguler untuk mengevaluasi pemisah. Ini adalah default.
SimpleMatch Gunakan perbandingan string sederhana saat mengevaluasi pemisah.
Garis tunggal Mode ini hanya mengenali awal dan akhir string. Ini adalah mode default.

Blok skrip (§7.1.8) menentukan aturan untuk pemisah, dan harus dievaluasi menjadi tipe bool.

Contoh:

"one,forty two,," -split ","              # 5 strings: "one" "forty two" "" ""

"abc","de" -split ""                      # 9 strings: "" "a" "b" "c" "" "" "d" "e" ""

"ab,cd","1,5,7,8" -split ",", 2           # 4 strings: "ab" "cd" "1" "5,7,8"

"10X20x30" -csplit "X", 0, "SimpleMatch"  # 2 strings: "10" "20x30"

"analogous" -split "[AEIOU]", 0, "RegexMatch, IgnoreCase"
                                          # 6 strings: "" "n" "l" "g" "" "s"

"analogous" -split { $_ -eq "a" -or $_ -eq "o" }, 4
                                          # 4 strings: "" "n" "l" "gous"

7.8.4.6 Subpertandingan

Pola yang dicocokkan dengan -match, -notmatch, dan -replace mungkin berisi sub-bagian (disebut submatche ) yang dibatasi oleh tanda kurung. Pertimbangkan contoh berikut:

"red" -match "red"

Hasilnya adalah $true dan kunci 0 dari $Matches berisi "merah", bagian string yang ditunjuk oleh operand kiri yang sama persis dengan pola yang ditunjuk oleh operand kanan.

Dalam contoh berikut, seluruh pola adalah kecocokan parsial (submatch):

"red" -match "(red)"

Seperti sebelumnya, kunci 0 berisi "merah"; namun, kunci 1 juga berisi "merah", yang merupakan bagian dari string yang ditunjuk oleh operand kiri yang sama persis dengan submatch.

Pertimbangkan pola berikut, lebih kompleks:

"red" -match "((r)e)(d)"

Pola ini memungkinkan subpencocokan dari "re", "r", "d", atau "red".

Sekali lagi, kunci 0 berisi "merah". Kunci 1 berisi "re", kunci 2 berisi "r", dan kunci 3 berisi "d". Pasangan kunci/nilai berada dalam urutan yang cocok dari kiri ke kanan dalam pola, dengan string yang lebih panjang cocok dengan yang lebih pendek.

Dalam kasus -replace, teks pengganti dapat mengakses subcocok melalui nama dengan bentuk $n, di mana kecocokan pertama adalah $1, yang kedua adalah $3, dan seterusnya. Misalnya

"Monday morning" -replace '(Monday|Tuesday) (morning|afternoon|evening)','the $2 of $1'

String yang dihasilkan adalah "pagi hari Senin".

Alih-alih membuat kunci di $Matches menjadi indeks berbasis nol, submatch dapat diberi nama menggunakan bentuk ?<*name*>. Misalnya, "((r)e)(d)" dapat ditulis dengan tiga submatche bernama, m1, m2, dan m3, sebagai berikut: "(?<m1>(?<m2>r)e)(?<m3>d)".

7.8.5 Shift operator

Sintaksis:

shift-operator: one of
    dash shl
    dash shr

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Deskripsi:

Operator shift kiri (-shl) dan operator shift kanan (-shr) mengonversi nilai yang dirancang oleh operand kiri ke jenis bilangan bulat dan nilai yang ditunjuk oleh operan kanan ke int, jika perlu, menggunakan konversi aritmatika biasa (§6,15).

Operator shift kiri menggeser operand kiri ke kiri sejauh jumlah bit yang dihitung sesuai penjelasan di bawah ini. Posisi bit kosong berurutan rendah diatur ke nol.

Operator shift kanan menggeser operan kiri ke arah kanan dengan sejumlah bit-bit yang dihitung seperti yang dijelaskan di bawah ini. Bit berurutan rendah dari operand kiri dibuang, bit yang tersisa bergeser ke kanan. Ketika operand kiri adalah nilai yang ditandatangani, posisi bit kosong urutan tinggi diatur ke nol jika operand kiri tidak negatif dan diatur ke satu jika operand kiri negatif. Ketika operand kiri adalah nilai yang tidak ditandatangani, posisi bit kosong urutan tinggi diatur ke nol.

Ketika operand kiri memiliki tipe int, jumlah shift diberikan oleh lima bit urutan rendah dari operand kanan. Ketika operand kanan memiliki tipe long, jumlah shift diberikan oleh enam bit terendah dari operand kanan.

Contoh:

0x0408 -shl 1             # int with value 0x0810
0x0408 -shr 3             # int with value 0x0081
0x100000000 -shr 0xfff81  # long with value 0x80000000

7.9 Operator Bitwise

Sintaksis:

bitwise-expression:
    unary-expression -band new-lines~opt~ unary-expression
    unary-expression -bor new-lines~opt~ unary-expression
    unary-expression -bxor new-lines~opt~ unary-expression

Deskripsi:

Operator bitwise AND -band, operator bitwise OR -bor, dan operator XOR bitwise -bxor mengonversi nilai yang ditunjuk oleh operan mereka menjadi jenis bilangan bulat, jika perlu, menggunakan konversi aritmatika biasa (§6,15). Setelah konversi, jika kedua nilai bertipe int maka hasilnya juga bertipe int. Jika tidak, jika kedua nilai memiliki tipe long, maka itu adalah tipe hasilnya. Jika satu nilai memiliki jenis int dan nilai lainnya memiliki jenis long, jenis hasilnya adalah long. Jika tidak, ekspresinya tidak terbentuk dengan benar. Hasilnya adalah bitwise AND, bitwise OR, atau bitwise XOR, masing-masing, dari nilai operand yang mungkin dikonversi.

Operator ini dibiarkan asosiatif. Mereka komutatif jika tidak ada operan yang mengandung efek samping.

Contoh:

0x0F0F -band 0xFE    # int with value 0xE
0x0F0F -band 0xFEL   # long with value 0xE
0x0F0F -band 14.6    # long with value 0xF

0x0F0F -bor 0xFE     # int with value 0xFFF
0x0F0F -bor 0xFEL    # long with value 0xFFF
0x0F0F -bor 14.40D   # long with value 0xF0F

0x0F0F -bxor 0xFE    # int with value 0xFF1
0x0F0F -bxor 0xFEL   # long with value 0xFF1
0x0F0F -bxor 14.40D  # long with value 0xF01
0x0F0F -bxor 14.6    # long with value 0xF00

7.10 Operator logis

Sintaksis:

logical-expression:
    unary-expression -and new-lines~opt~ unary-expression
    unary-expression -or new-lines~opt~ unary-expression
    unary-expression -xor new-lines~opt~ unary-expression

Deskripsi:

Operator AND logis -and mengonversi nilai yang ditunjuk oleh operannya menjadi bool, jika perlu (§6,2). Hasilnya adalah AND logis dari nilai operan yang mungkin dikonversi, dan memiliki tipe bool. Jika operan kiri bernilai False, operan kanan tidak dievaluasi.

Operator OR logis -or mengonversi nilai yang ditunjuk oleh operannya menjadi bool, jika perlu (§6,2). Hasilnya adalah OR logis dari nilai operand yang mungkin dikonversi, dan memiliki jenis bool. Jika operan kiri mengevaluasi ke True, operan kanan tidak dievaluasi.

Operator XOR logis -xor mengonversi nilai yang ditunjuk oleh operannya menjadi bool (§6,2). Hasilnya adalah XOR logis dari nilai operand yang mungkin dikonversi, dan memiliki tipe bool.

Operator ini dibiarkan asosiatif.

Contoh:

$j = 10
$k = 20
($j -gt 5) -and (++$k -lt 15)   # True -and False -> False
($j -gt 5) -and ($k -le 21)     # True -and True -> True
($j++ -gt 5) -and ($j -le 10)   # True -and False -> False
($j -eq 5) -and (++$k -gt 15)   # False -and True -> False

$j = 10
$k = 20
($j++ -gt 5) -or (++$k -lt 15)  # True -or False -> True
($j -eq 10) -or ($k -gt 15)     # False -or True -> True
($j -eq 10) -or (++$k -le 20)   # False -or False -> False

$j = 10
$k = 20
($j++ -gt 5) -xor (++$k -lt 15) # True -xor False -> True
($j -eq 10) -xor ($k -gt 15)    # False -xor True -> True
($j -gt 10) -xor (++$k -le 25)  # True -xor True -> False

7.11 Operator penugasan

Sintaksis:

assignment-expression:
    expression assignment-operator statement

assignment-operator: *one of
    =   dash =   +=   *=   /=   %=

Deskripsi:

Operator penugasan menyimpan nilai di lokasi yang dapat ditulis yang ditunjuk oleh ekspresi . Untuk diskusi operator penugasan =, lihat §7.11.1. Untuk diskusi semua operator penugasan lainnya, lihat §7.11.2.

Ekspresi penugasan memiliki nilai yang ditunjuk oleh ekspresi setelah penugasan dilakukan; namun, ekspresi penugasan itu tidak sendiri menunjuk lokasi yang dapat ditulis. Jika ekspresi dibatasi jenis (§5,3), jenis yang digunakan dalam batasan tersebut adalah jenis hasilnya; jika tidak, jenis hasilnya adalah jenis setelah konversi aritmatika biasa (§6,15) telah diterapkan.

Operator ini bersifat asosiatif kanan.

7.11.1 Penugasan sederhana

Deskripsi:

Dalam penugasan sederhana (=), nilai yang ditunjuk oleh pernyataan menggantikan nilai yang disimpan di lokasi yang dapat ditulis yang ditunjuk oleh ekspresi . Namun, jika ekspresi menunjuk kunci yang tidak ada dalam Hashtable, kunci tersebut ditambahkan ke Hashtable dengan nilai terkait dari nilai yang ditunjuk oleh pernyataan .

Seperti yang ditunjukkan oleh tata bahasa, ekspresi dapat menunjuk daftar lokasi bisa-tulis yang dipisahkan koma. Ini dikenal sebagai penugasan ganda. pernyataan menunjuk daftar satu atau beberapa nilai yang dipisahkan koma. Koma dalam salah satu daftar operand adalah bagian dari sintaks beberapa tugas dan tidak mewakili operator koma biner. Nilai diambil dari daftar yang ditunjuk oleh pernyataan , dalam urutan leksikal, dan disimpan di lokasi yang dapat ditulis yang sesuai dengan ekspresi . Jika daftar yang ditentukan oleh pernyataan memiliki lebih sedikit nilai daripada lokasi dapat ditulis untuk ekspresi , maka lokasi yang berlebih akan mengambil nilai $null. Jika daftar yang ditunjuk oleh pernyataan memiliki lebih banyak nilai daripada ekspresi lokasi bisa-tulis, all but the right-most expression location take on the corresponding statement value and the right-most expression location menjadi array 1 dimensi yang tidak dibatasi dengan semua pernyataan yang tersisa nilai sebagai elemen.

Untuk pernyataan yang memiliki nilai (§8.1.2), pernyataan dapat menjadi pernyataan.

Contoh:

$a = 20; $b = $a + 12L             # $b has type long, value 22
$hypot = [Math]::Sqrt(3*3 + 4*4)   # type double, value 5
$a = $b = $c = 10.20D              # all have type decimal, value 10.20
$a = (10,20,30),(1,2)              # type [Object[]], Length 2
[int]$x = 10.6                     # type int, value 11
[long]$x = "0xabc"                 # type long, value 0xabc
$a = [float]                       # value type literal [float]
$i,$j,$k = 10,"red",$true          # $i is 10, $j is "red", $k is True
$i,$j = 10,"red",$true             # $i is 10, $j is [Object[]], Length 2
$i,$j = (10,"red"),$true           # $i is [Object[]], Length 2, $j is True
$i,$j,$k = 10                      # $i is 10, $j is $null, $k is $null

$h = @{}
[int] $h.Lower, [int] $h.Upper = -split "10 100"

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.Dept = "Finance"               # adds element Finance
$h1["City"] = "New York"           # adds element City

[int]$Variable:v = 123.456         # v takes on the value 123
${E:output.txt} = "a"              # write text to the given file
$Env:MyPath = "X:\data\file.txt"   # define the environment variable
$Function:F = { param ($a, $b) "Hello there, $a, $b" }
F 10 "red"                         # define and invoke a function
function Demo { "Hi there from inside Demo" }
$Alias:A = "Demo"                  # create alias for function Demo
A                                  # invoke function Demo via the alias

7.11.2 Penetapan gabungan

Deskripsi:

Penugasan gabungan berbentuk E1 op= E2, dan setara dengan ekspresi penugasan sederhana E1 = E1 op (E2) kecuali bahwa dalam kasus penugasan gabungan, ekspresi E1 dievaluasi hanya sekali. Jika ekspresi dibatasi jenis (§5,3), jenis yang digunakan dalam batasan tersebut adalah jenis hasilnya; jika tidak, jenis hasil ditentukan oleh op. Untuk *=, lihat §7.6.1, §7.6.2, §7.6.3; untuk /=, lihat §7.6.4; untuk %=, lihat §7.6.5; untuk +=, lihat §7.7.1, §7.7.2, §7.7.3; untuk -=, lihat §7.7.5.

Nota

Operand yang menunjukkan nilai numerik tanpa batasan mungkin dapat mengubah jenisnya dengan operator penugasan ketika hasil disimpan.

Contoh:

$a = 1234; $a *= (3 + 2)  # type is int, value is 1234 * (3 + 2)
$b = 10,20,30             # $b[1] has type int, value 20
$b[1] /= 6                # $b[1] has type double, value 3.33...

$i = 0
$b = 10,20,30
$b[++$i] += 2             # side effect evaluated only once

[int]$Variable:v = 10     # v takes on the value 10
$Variable:v -= 3          # 3 is subtracted from v

${E:output.txt} = "a"     # write text to the given file
${E:output.txt} += "b"    # append text to the file giving ab
${E:output.txt} *= 4      # replicate ab 4 times giving abababab

7.12 Operator pengalihan

Sintaksis:

pipeline:
    expression redirections~opt~ pipeline-tail~opt~
    command verbatim-command-argument~opt~ pipeline-tail~opt~

redirections:
    redirection
    redirections redirection

redirection:
    merging-redirection-operator
    file-redirection-operator redirected-file-name

redirected-file-name:
    command-argument
    primary-expression

file-redirection-operator: one of
    >   >>   2>   2>>   3>   3>>   4>   4>>
    5>  5>>  6>   6>>   >    >>    <

merging-redirection-operator: one of
    >&1   2>&1   3>&1   4>&1   5>&1   6>&1
    >&2   1>&2   3>&2   4>&2   5>&2   6>&2

Deskripsi:

Operator pengalihan > mengambil output standar dari alur dan mengalihkannya ke lokasi yang ditunjuk oleh nama file yang dialihkan, menimpa konten lokasi saat ini.

Operator pengalihan >> mengambil output standar dari alur dan mengalihkannya ke lokasi yang ditunjuk oleh nama file yang dialihkan, menambahkan ke konten lokasi saat ini, jika ada. Jika lokasi tersebut tidak ada, lokasi tersebut akan dibuat.

Operator pengalihan dengan bentuk n> mengambil output dari aliran dan dari pipeline dan mengalihkannya ke lokasi yang ditentukan oleh nama file yang dialihkan, menggantikan konten saat ini di lokasi tersebut.

Operator pengalihan dengan format n>> mengambil output aliran dan dari pipeline dan mengalihkannya ke lokasi yang ditunjuk oleh nama file yang dialihkan, dengan menambahkan ke konten saat ini di lokasi tersebut, jika ada. Jika lokasi tersebut tidak ada, lokasi tersebut akan dibuat.

Operator pengalihan dengan bentuk m>&n menulis output dari stream m ke lokasi yang sama dengan stream n.

Berikut ini adalah aliran yang valid:

Stream Deskripsi
1 Saluran keluaran standar
2 Saluran keluaran kesalahan
3 Aliran keluaran peringatan
4 Aliran keluaran rinci
5 Aliran keluaran debug
* Keluaran standar, keluaran kesalahan, keluaran peringatan, keluaran rinci, dan keluaran debug

Operator pengalihan 1>&2, 6>, 6>> dan < dicadangkan untuk digunakan di masa mendatang.

Jika nilai nama file yang dialihkan pada output adalah $null, maka output akan dibuang.

Biasanya, nilai ekspresi yang berisi efek samping tingkat atas tidak ditulis ke alur kecuali ekspresi tersebut diapit dalam sepasang tanda kurung. Namun, jika ekspresi seperti itu adalah operand kiri dari operator yang mengalihkan output standar, nilainya akan ditampilkan.

Contoh:

$i = 200                       # pipeline gets nothing
$i                             # pipeline gets result
$i > output1.txt               # result redirected to named file
++$i >> output1.txt            # result appended to named file
type file1.txt 2> error1.txt   # error output redirected to named file
type file2.txt 2>> error1.txt  # error output appended to named file
dir -Verbose 4> verbose1.txt   # verbose output redirected to named file

# Send all output to output2.txt
dir -Verbose -Debug -WarningAction Continue *> output2.txt

# error output redirected to named file, verbose output redirected
# to the same location as error output
dir -Verbose 4>&2 2> error2.txt