7. Wyrażenia

Składnia:

expression:
    logical-expression

Opis:

Wyrażenie to sekwencja operatorów i operandów, która wyznacza metodę, funkcję, lokalizację zapisywalna lub wartość; określa obliczanie wartości; tworzy co najmniej jeden efekt ubocznym; lub wykonuje kombinację. Na przykład

  • Literał 123 jest wyrażeniem, które wyznacza wartość int 123.
  • Wyrażenie wyznacza 1,2,3,4 4-elementowy obiekt tablicy z pokazanymi wartościami.
  • Wyrażenie określa 10.4 * $a obliczenia.
  • Wyrażenie generuje $a++ efekt uboczny.
  • Wyrażenie wykonuje $a[$i--] = $b[++$j] kombinację tych elementów.

Z wyjątkiem sytuacji określonych dla niektórych operatorów, kolejność oceny terminów w wyrażeniu i kolejność, w której mają miejsce skutki uboczne, są nieokreślone. Przykłady nieokreślonego zachowania obejmują następujące elementy: $i++ + $i, $i + --$ii $w[$j++] = $v[$j].

Implementacja programu PowerShell może zapewnić obsługę typów zdefiniowanych przez użytkownika, a te typy mogą mieć zdefiniowane operacje. Wszystkie szczegóły takich typów i operacji są definiowane w implementacji.

Wyrażenie najwyższego poziomu nie jest częścią większego wyrażenia. Jeśli wyrażenie najwyższego poziomu zawiera operator efekt uboczny, wartość tego wyrażenia nie jest zapisywana w potoku; w przeciwnym razie jest. Szczegółowe omówienie tego tematu można znaleźć w tece dotyczącej tematu .7.1.1 .

Zwykle wyrażenie, które wyznacza kolekcję ([4) jest wyliczane do jej elementów składowych, gdy jest używana wartość tego wyrażenia. Nie jest to jednak przypadek, gdy wyrażenie jest wywołaniami polecenia cmdlet. Na przykład

$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

W pierwszych dwóch zastosowaniach $(...) operatora $xwyrażenie wyznaczające kolekcję jest zmienną , int która jest wyliczana w wyniku trzech wartości plus int 99. Jednak w trzecim przypadku wyrażenie jest bezpośrednim wywołaniem polecenia cmdlet, więc wynik nie jest wyliczany i $a jest tablicą dwóch elementów: int[3] i int.

Jeśli operacja nie jest zdefiniowana przez program PowerShell, sprawdzany jest typ wartości wyznaczonej przez lewy operand, aby sprawdzić, czy ma odpowiednią op_<operation> metodę.

7.1 Wyrażenia podstawowe

Składnia:

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 Grupowanie nawiasów

Składnia:

Porada

Notacja ~opt~ w definicjach składni wskazuje, że jednostka leksyktyczna jest opcjonalna w składni.

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

Opis:

Wyrażenie w nawiasie jest wyrażeniem podstawowym , którego typ i wartość są takie same jak wyrażenia bez nawiasów. Jeśli wyrażenie wyznacza zmienną, wyrażenie w nawiasach wyznacza tę samą zmienną. Na przykład elementy $x.m i ($x).m są równoważne.

Nawiasy grupowania mogą być używane w wyrażeniu do dokumentowania domyślnego pierwszeństwa i kojarzenia w ramach tego wyrażenia. Mogą one również służyć do zastępowania tego domyślnego pierwszeństwa i kojarzenia. Na przykład

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

Zazwyczaj nawiasy grupujące na najwyższym poziomie są nadmiarowe. Jednak nie zawsze tak jest. Rozpatrzmy następujący przykład:

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

W drugim przypadku nawiasy zmieniają semantykę, w wyniku czego tablica, której dwa elementy są tablicą 2 ints i skalarną int 6.

Oto inny wyjątek:

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

W pierwszym i trzecim przypadku wartość wyniku jest zapisywana w potoku. Jednak mimo że wyrażenie w drugim przypadku jest oceniane, wynik nie jest zapisywany w potoku ze względu na obecność operatora efektu ubocznego = na najwyższym poziomie. (Usunięcie części $a = umożliwia napisanie wartości, ponieważ * nie jest operatorem efektem ubocznym).

Aby zatrzymać zapisywanie w potoku wartości dowolnego wyrażenia, które nie zawiera efektów ubocznym najwyższego poziomu, należy ją jawnie odrzucić w następujący sposób:

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

Aby zapisać w potoku wartość dowolnego wyrażenia zawierającego efekty uboczne najwyższego poziomu, należy ująć to wyrażenie w nawiasy w następujący sposób:

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

W związku z tym nawiasy grupowania w tym przypadku nie są nadmiarowe.

W poniższym przykładzie podstawianie zmiennych ([2.3.5.2) odbywa się w literału ciągu:

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

W pierwszym przypadku nawiasy reprezentują ograniczniki wyrażenia podrzędnego, które nie grupują nawiasów , a ponieważ wyrażenie najwyższego poziomu zawiera operator efektu ubocznego, wartość wyrażenia nie jest zapisywana w potoku. Oczywiście znaki i >< nadal pisane). Jeśli zostanie dodany nawias grupowania — jak pokazano w drugim przypadku — zapisywanie jest włączone.

Każdy z poniższych przykładów zawiera operatory efektu ubocznego najwyższego poziomu:

$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

Użycie nawiasów grupowania wokół wyrażenia bez efektów ubocznymi najwyższego poziomu sprawia, że te nawiasy są nadmiarowe. Na przykład:

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

Rozważmy następujący przykład, który ma dwa skutki uboczne, z których żaden nie znajduje się na najwyższym poziomie:

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

Wynik jest zapisywany w potoku, ponieważ wyrażenie najwyższego poziomu nie ma skutków ubocznych.

7.1.2 Dostęp do członków

Składnia:

member-access: Note no whitespace is allowed after primary-expression. 
    primary-expression . member-name
    primary-expression :: member-name

Opis:

Operator służy . do wybierania członka wystąpienia z obiektu lub klucza z obiektu Hashtable. Lewy operand musi wyznaczyć obiekt, a prawy operand musi wyznaczyć dostępny element członkowski wystąpienia.

Prawy operand wyznacza dostępny element członkowski wystąpienia w obrębie typu obiektu wyznaczonego przez lewy operand lub, jeśli lewy operand wyznaczy tablicę, prawy operand wyznacza dostępne składowe wystąpienia w każdym elemencie tablicy.

Odstępy przed operatorem nie są . dozwolone.

Ten operator pozostaje asocjacyjny.

Operator służy :: do wybierania statycznego członka z danego typu. Lewy operand musi wyznaczyć typ, a operand po prawej stronie musi wyznaczyć dostępny statyczny element członkowski w ramach tego typu.

Odstępy przed operatorem nie są :: dozwolone.

Ten operator pozostaje asocjacyjny.

Jeśli operand po prawej stronie wyznacza zapisywalna lokalizację w obrębie typu obiektu wyznaczonego przez lewy operand, całe wyrażenie wyznacza lokalizację zapisywalna.

Przykłady:

$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 Wyrażenia wywołania

Składnia:

invocation-expression: Note no whitespace is allowed after primary-expression. 
    primary-expression . member-name argument-list
    primary-expression :: member-name argument-list

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

Opis:

Wyrażenie invocation-expression wywołuje metodę wyznaczoną przez wyrażenie-podstawowe. nazwa-członka lub wyrażenie-podstawowe::nazwa-członka. Nawiasy na liście argumentów zawierają potencjalnie pustą listę wyrażeń rozdzielonych przecinkami, która wyznacza argumenty, których wartości są przekazywane do metody . Przed wywołaniu metody argumenty są obliczane i konwertowane zgodnie z regułami wartości .6, jeśli to konieczne, w celu dopasowania do typów oczekiwanych przez metodę. Kolejność oceny wyrażenia podstawowego. nazwa-członka, wyrażenie-podstawowe::nazwa-członka i argumenty są nieokreślone.

Ten operator pozostaje asocjacyjny.

Typem wyniku wyrażenia wywołania jest projektator metody (";4.5.24).

Przykłady:

[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 Dostęp do elementów

Składnia:

element-access: Note no whitespace is allowed between primary-expression and [.
    primary-expression [ new-lines~opt~ expression new-lines~opt~ ]

Opis:

Między wyrażeniem podstawowym a lewym nawiasem kwadratowym ([) nie może być żadnych białych spacji.

7.1.4.1 Indeksowanie tablicy

Opis:

Tablice zostały szczegółowo omówione w artykule .9. Jeśli wyrażenie jest tablicą 1-wymiarową, zobacz .7.1.4.5.

Gdy wyrażenie-podstawowe wyznacza tablicę 1-wymiarową A, operator zwraca element [] int``A[0 + expression] znajdujący się po przekonwertowaniu wartości wyrażenia na . Wynik ma typ elementu tablicy, która jest indeksowana. Jeśli wyrażenie jest ujemne, A[expression] wyznacza element znajdujący się w .A[A.Length + expression]

Gdy wyrażenie-podstawowe wyznacza tablicę dwuwymiarową B, operator [] zwraca element B[0 + row,0 + column] znajdujący się po przekonwertowaniu wartości składników wiersza i kolumny wyrażenia (które są określone jako lista rozdzielona przecinkami) intna . Wynik ma typ elementu tablicy, która jest indeksowana. W przeciwieństwie do tablicy 1-wymiarowej pozycje ujemne nie mają specjalnego znaczenia.

Gdy wyrażenie-podstawowe wyznacza tablicę z co najmniej trzema wymiarami, stosowane są reguły dla tablic dwuwymiarowych, a pozycje wymiarów są określane jako rozdzielana przecinkami lista wartości.

Jeśli próba uzyskania dostępu do odczytu dla nieistnie istniejącego elementu jest podejmowana, wynikiem jest .$null Zapis w nieistnienym elemencie jest błędem.

W przypadku wyrażenia indeksu dolnego tablicy wielowymiarowej kolejność oceny wyrażeń pozycji wymiaru jest nieokreślona. Na przykład w przypadku tablicy 3-wymiarowej $a``$a[$i++,$i,++$i] zachowanie funkcji jest nieokreślone.

Jeśli wyrażenie jest tablicą, zobacz .7.1.4.5.

Ten operator pozostaje asocjacyjny.

Przykłady:

$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]

W przypadku próby uzyskania dostępu do zapisu do nieistniejący element jest wywoływany wyjątek IndexOutOfRange .

7.1.4.2 Indeksowanie ciągu

Opis:

Gdy wyrażenie-podstawowe wyznacza ciąg S, operator [] zwraca znak znajdujący się w pozycji od zera wskazanej przez wyrażenie jako znak. Jeśli wyrażenie jest większe niż lub równe długości tego ciągu, wynikiem jest $null. Jeśli wyrażenie jest ujemne, S[expression] wyznacza element znajdujący się w .S[S.Length + expression]

Przykłady:

$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 Indeksowanie tablicy skrótów

Opis:

Gdy wyrażenie-podstawowe wyznacza tablicę skrótów, operator [] zwraca wartości skojarzone z kluczami wyznaczonymi przez wyrażenie. Typ wyrażenia nie jest ograniczony.

Gdy wyrażenie jest nazwą pojedynczego klucza, wynik jest skojarzoną wartością i ma ten typ, chyba że taki klucz nie istnieje. W takim przypadku wynikiem jest $null. Jeśli $null element jest używany jako klucz, zachowanie jest definiowane przez implementację. Jeśli wyrażenie jest tablicą nazw kluczy, zobacz .7.1.4.5.

Jeśli wyrażenie jest tablicą, zobacz .7.1.4.5.

Przykłady:

$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

Gdy wyrażenie jest nazwą pojedynczego klucza, $null jeśli jest używana jako jedyna wartość do indeksowania tablicy skrótów, jest wywoływany wyjątek NullArrayIndex .

7.1.4.4 Subskrybowanie dokumentu XML

Opis:

Gdy wyrażenie-podstawowe wyznacza obiekt typu xml, wyrażenie jest konwertowane na ciąg, jeśli to konieczne, a operator [] zwraca pierwszy element podrzędny o nazwie określonej przez wyrażenie. Typem wyrażenia musi być ciąg. Typ wyniku to zdefiniowana implementacja. Wynik może być indeksowany w celu zwrócenia pierwszego elementu podrzędnego. Jeśli element podrzędny nie istnieje o nazwie określonej przez wyrażenie, wynikiem jest $null. Wynik nie wyznacza lokalizacji zapisywalne.

Przykłady:

$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`

Typ wyniku to System.Xml.XmlElement lub System.String.

7.1.4.5 Generowanie wycinków tablicy

Gdy wyrażenie-podstawowe wyznacza obiekt typu, który jest wyliczowalny ([4) lub tablicy skrótów, a wyrażenie jest tablicą 1-wymiarową, wynikiem jest wycinek tablicy ([9.9) zawierający elementy wyrażenia podstawowego wyznaczone przez elementy wyrażenia.

W przypadku tablicy skrótów wycinek tablicy zawiera skojarzone wartości z dostarczonymi kluczami, chyba że taki klucz nie istnieje. W takim przypadku odpowiednim elementem jest $null. Jeśli $null jest używana jako dowolna nazwa klucza, zachowanie jest definiowane przez implementację.

Przykłady:

$a = [int[]](30,40,50,60,70,80,90)
$a[1,3,5]                 # slice has Length 3, value 40,60,80
++$a[1,3,5][1]            # preincrement 60 in array 40,60,80
$a[,5]                    # slice with Length 1
$a[@()]                   # slice with Length 0
$a[-1..-3]                # slice with Length 0, 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 1 (123)

Windows PowerShell: Gdy wyrażenie jest kolekcją co najmniej dwóch nazw kluczy, $null jeśli jest używana jako dowolna nazwa klucza, który klucz jest ignorowany i nie ma odpowiadającego mu elementu w wynikowej tablicy.

7.1.5 Operatory przyrostka inkrementatora i dekrementatora

Składnia:

post-increment-expression:
    primary-expression ++

post-decrement-expression:
    primary-expression dashdash

dashdash:
    --

Opis:

Wyrażenie podstawowe musi wyznaczyć zapisywalna lokalizację z wartością typu liczbowego ([4) lub wartością $null. Jeśli wartość wyznaczona przez operand $nullto , ta wartość jest konwertowana na typ int i wartość zero przed oceną operatora. Typ wartości wyznaczonej przez wyrażenie-podstawowe może ulec zmianie po zapisaniu wyniku. Aby uzyskać omówienie zmiany typu za pośrednictwem przypisania, zobacz temat .7.11 .

Wynikiem wytwarzanych przez operator przyrostka ++ jest wartość wyznaczona przez operand. Po uzyskaniu tego wyniku wartość wyznaczona przez operand jest zwiększana o 1 odpowiedniego typu. Typ wyniku wyrażenia jest E++ taki sam jak dla E + 1 wyniku wyrażenia (";7,7).

Wynikiem wytwarzanych przez operator przyrostka -- jest wartość wyznaczona przez operand. Po uzyskaniu tego wyniku wartość wyznaczona przez operand jest zmniejszana o 1 odpowiedniego typu. Typ wyniku wyrażenia jest E-- taki sam jak dla E - 1 wyniku wyrażenia (";7,7).

Te operatory są pozostawiane jako asocjacyjne.

Przykłady:

$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 bahavior

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

Operator 7.1.6 $(...)

Składnia:

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

Opis:

Jeśli lista-instrukcji zostanie pominięta, wynikiem będzie $null. W przeciwnym razie zostanie oceniona lista-instrukcji. Wszystkie obiekty zapisywane w potoku w ramach oceny są zbierane w nieposkonanych tablicach jednowymiarowych w porządek. Jeśli tablica zebranych obiektów jest pusta, wynikiem jest $null. Jeśli tablica zebranych obiektów zawiera jeden element, wynikiem jest ten element; w przeciwnym razie wynikiem jest nieprzetrenowana 1-wymiarowa tablica zebranych wyników.

Przykłady:

$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)

Operator 7.1.7 @(...)

Składnia:

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

Opis:

Jeśli lista-instrukcji zostanie pominięta, wynikiem jest nieprzetrenowana 1-wymiarowa tablica o długości zero. W przeciwnym razie jest oceniana lista instrukcji, a wszystkie obiekty zapisane w potoku w ramach oceny są zbierane w nieposprawowanej tablicy jednowymiarowej w kolejności. Wynikiem jest (prawdopodobnie pusta) nieprzetrenowana tablica 1-wymiarowa.

Przykłady:

$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 Wyrażenie blokowe skryptu

Składnia:

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

Opis:

Blok param jest opisany w .8.10.9. Nazwana lista-bloków jest opisana w .8.10.7.

Blok skryptu to nienazowany blok instrukcji, który może być używany jako pojedyncza jednostka. Bloki skryptów mogą służyć do wywoływania bloku kodu tak, jakby było to pojedyncze polecenie lub można je przypisać do zmiennych, które mogą być wykonywane.

Wykonywana jest nazwana lista-bloków lub lista-instrukcji , a typy i wartości wyniku są typami i wartościami wyników tych zestawów instrukcji.

Wyrażenie script-block-expression ma typ scriptblock (";4.3.7).

Jeśli blok param zostanie pominięty, wszystkie argumenty przekazane do bloku skryptu są dostępne $args za pośrednictwem ([8.10.1).

Podczas tworzenia powiązania parametrów blok skryptu może zostać przekazany jako obiekt bloku skryptu lub jako wynik po ocenie bloku skryptu. Aby uzyskać więcej informacji, zobacz .6.17 .

7.1.9 Wyrażenie literału skrótu

Składnia:

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

Opis:

Wyrażenie-literału-skrótu służy do tworzenia tablicy skrótów ([10) z zera lub większej liczby elementów, z których każdy jest parą klucz/wartość.

Klucz może mieć dowolny typ z wyjątkiem typu null. Skojarzone wartości mogą mieć dowolny typ, w tym typ null, a każda z tych wartości może być dowolnym wyrażeniem, które wyznacza żądaną wartość, w tym $null.

Kolejność par klucz/wartość nie jest istotna.

Przykłady:

$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 }

Tworzy dwie tablice skrótów i $h1 $h2, z których każda zawiera trzy pary klucz/wartość, a trzecia wartość , $h3która jest pusta. Tabela skrótów $h4 ma klucze różnych typów.

7.1.10 Wyrażenie literału typu

Składnia:

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 [

Opis:

Literał typu jest reprezentowany w implementacji przez niektóre nieokreślone typy bazowe. W związku z tym nazwa typu jest synonimem jego typu bazowego.

Literały typu są używane w wielu kontekstach:

  • Określanie konwersji jawnej (6, []7.2.9)
  • Tworzenie tablicy z ograniczeniami typu ([9.4)
  • Uzyskiwanie dostępu do statycznych elementów członkowskich obiektu ([7.1.2)
  • Określanie ograniczenia typu dla zmiennej ([5.3) lub parametru funkcji ([8.10.2)

Przykłady:

Przykłady literałów typów to [int], [object[]i [int[,,]]. Ogólny typ stosu ([4.4), [Stack[string]]który jest wyspecjalizowany do przechowywania ciągów, może być zapisany jako , a ogólny typ słownika, który jest wyspecjalizowany int do przechowywania kluczy ze skojarzonymi wartościami ciągów, może być napisany jako [Dictionary[int,string]].

Typ literału typu to System.Type. Pełna nazwa typu sugerowanego Stack[string] powyżej to System.Collections.Generic.Stack[int]. Pełna nazwa typu sugerowanego Dictionary[int,string] powyżej to System.Collections.Generic.Dictionary[int,string].

7.2 Operatory unary

Składnia:

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

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

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

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

cast-expression:
    type-literal unary-expression

dashdash:
    dash dash

7.2.1 Operator przecinka w trybie unarytmowym

Opis:

Ten operator tworzy nieprzeszkoloną tablicę 1-wymiarową mającą jeden element, którego typ i wartość są wartościami wyrażenia jednoargowego.

Ten operator ma rację asocjacyjny.

Przykłady:

$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 Logiczne NOT

Opis:

Operator -not konwertuje wartość wyznaczoną przez wyrażenie-ary na typ bool ([6.2], jeśli to konieczne, i generuje wynik tego typu. Jeśli wartość wyrażenia jednoznacznego ma wartość True, wynikiem jest wartość False i na odwrót. Operator ! jest alternatywną pisownią dla -not.

Ten operator ma rację asocjacyjny.

Przykłady:

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

7.2.3 Bitowe NOT

Opis:

Operator -bnot konwertuje wartość wyznaczoną przez wyrażenie-ary na typ liczby całkowitej (=6,4), jeśli to konieczne. Jeśli przekonwertowana wartość może być reprezentowana w typie int, jest to typ wyniku. W innym przypadku, jeśli przekonwertowana wartość może być reprezentowana przez długi typ, jest to typ wyniku. W przeciwnym razie wyrażenie nie jest formowane. Wartość wynikowa to uzupełnienie przekonwertowanej wartości.

Ten operator ma rację asocjacyjny.

Przykłady:

-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

Opis:

Wyrażenie formularza + wyrażenie-unary jest traktowane tak, jakby zostało zapisane jako 0 + unary-expression (";7.7). Literał liczby całkowitej 0 ma typ int.

Ten operator ma rację asocjacyjny.

Przykłady:

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

7.2.5 Unary minus

Opis:

Wyrażenie formy -wyrażenie-unary jest traktowane tak, jakby zostało zapisane jako 0 - unary-expression (";7.7). Literał liczby całkowitej 0 ma typ int.

Ten operator ma rację asocjacyjny.

Przykłady:

-$true # typ int, wartość -1 -123L # typ long, wartość -123 -0.12340D # typ decimal, wartość -0.12340

7.2.6 Operatory prefiksu inkrementacja i dekrementacja

Opis:

Wyrażenie-ary musi wyznaczyć zapisywalna lokalizację z wartością typu liczbowego ([4] lub wartością $null. Jeśli wartość wyznaczona przez jej wyrażenie-unary $nullto , wartość wyrażenia unary jest konwertowana na typ int i wartość zero przed oceną operatora.

Uwaga

Typ wartości wyznaczonej przez wyrażenie-ary może ulec zmianie po zapisaniu wyniku. Aby uzyskać omówienie zmiany typu za pośrednictwem przypisania, zobacz temat .7.11 .

W przypadku operatora prefiksu ++ wartość wyrażenia jednoznacznego jest zwiększana o 1 odpowiedniego typu. Wynikiem jest nowa wartość po inkrementacjach. Wyrażenie jest ++E równoważne wyrażeniu E += 1 (";7.11.2).

W przypadku operatora -- prefiksu wartość wyrażenia jednoznacznego jest zmniejszana o 1 odpowiedniego typu. Wynikiem jest nowa wartość po zakończeniu dekrementowania. Wyrażenie jest --E równoważne wyrażeniu E -= 1 (";7.11.2).

Te operatory są odpowiednie jako asocjacyjne.

Przykłady:

$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->-1

7.2.7 Operator -join

Opis:

Operator jednoargowy -join tworzy ciąg, który jest ujednoznaczeniem wartości jednego lub większej liczby obiektów wyznaczonych przez wyrażenie jednoargwartowe. (Separator można wstawić przy użyciu wersji binarnej tego operatora (";7.8.4.4).)

Wyrażenie-unary może być wartością skalarną lub kolekcją.

Przykłady:

-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 podziału -unary

Opis:

Operator jednoargowy -split dzieli jeden lub więcej ciągów wyznaczonych przez wyrażenie jednoargwartościowe, zwracając ich części podrzędne w ograniczonej 1-wymiarowej tablicy ciągu. Traktuje wszelkie ciągłe grupy znaków odstępu jako ogranicznik między kolejnymi częściami podrzędnymi. (Jawny ciąg ogranicznika można określić przy użyciu wersji binarnej tego operatora (";7.8.4.5).) Ten operator ma dwa warianty (";7,8).

Tekst ogranicznika nie jest uwzględniony w wynikowych ciągach. Wiodące i końcowe białe spacje w ciągu wejściowym są ignorowane. Ciąg wejściowy, który jest pusty lub zawiera białe spacje, powoduje tylko tablicę 1 ciągu, która jest pusta.

Wyrażenie-unary może wyznaczyć wartość skalarną lub tablicę ciągów.

Przykłady:

-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 rzutowania

Opis:

Ten operator konwertuje jawnie ([6) wartość wyznaczoną przez wyrażenie-ary na typ wyznaczony przez literał typu. Jeśli literał typu jest inny niż void, typem wyniku jest nazwany typ, a wartość jest wartością po konwersji. Jeśli literał typu jest typu void, żaden obiekt nie jest zapisywany w potoku i nie ma żadnego wyniku.

Gdy wyrażenie dowolnego typu jest rzutowanie na ten sam typ, wynikowy typ i wartość są typem i wartością wyrażenia jednoznacznego.

Ten operator ma rację asocjacyjny.

Przykłady:

[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 przecinka binarnego

Składnia:

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

Opis:

Operator przecinka binarnego tworzy tablicę 1-wymiarową, której elementy są wartościami wyznaczonymi przez jego operandy, w kolejności leksykacznej. Tablica ma nieprzetrenowany typ.

Przykłady:

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

Dodanie nawiasów grupowania do niektórych wyrażeń binarnych przecinków nie dokumentuje domyślnego pierwszeństwa; Zamiast tego zmienia wynik.

7.4 Operator zakresu

Składnia:

range-expression:
array-literal-expression
range-expression *..* new-lines~opt~
array-literal-expression

Opis:

Wyrażenie-zakresu tworzy nieprzeszkoloną tablicę 1-wymiarową, której elementy są wartościami sekwencji int określonymi przez granice zakresu. Wartości wyznaczone przez operandy są w razie potrzeby konwertowane na int ([6.4]). Operand wyznaczający dolną wartość po konwersji jest dolną granicą, a operand wyznaczający wyższą wartość po konwersji jest górną granicą. Obie granice mogą być takie same. W takim przypadku tablica wynikowa ma długość 1. Jeśli lewy operand wyznacza dolną granica, sekwencja jest w kolejności rosnącej. Jeśli lewy operand wyznacza górną granicę, sekwencja jest w kolejności malejącej.

Koncepcyjnie ten operator jest skrótem do odpowiedniej binarnej sekwencji operatorów przecinków. Na przykład zakres można również 5..8 wygenerować przy użyciu funkcji 5,6,7,8. Jeśli jednak jest potrzebna sekwencja rosnąca lub malejąca bez tablicy, implementacja może uniknąć generowania rzeczywistej tablicy. Na przykład w programie foreach ($i in 1..5) { ... }nie trzeba tworzyć tablicy.

Wyrażenie-zakresu może służyć do określania wycinka tablicy (";9.9).

Przykłady:

1..10        # ascending range 1..10
-500..-495   # descending range -500..-495
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

7.5, operator formatu

Składnia:

format-expression:
    range-expression
    format-expression 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)

Opis:

Wyrażenie-formatu formatuje co najmniej jedną wartość wyznaczoną przez wyrażenie-zakresu zgodnie z ciągiem specyfikacji formatu wyznaczonym przez wyrażenie-formatu. Pozycje wartości wyznaczonych przez wyrażenie-zakresu są numerowane od zera i zwiększane w kolejności leksykacznej. Wynik ma typ string.

Ciąg specyfikacji formatu może zawierać zero lub więcej specyfikacji formatu, z których każda ma następującą postać:

{N [ ,M ][ : FormatString ]}

N reprezentuje (wymaganą) pozycję wartości wyrażenia zakresu , M reprezentuje (opcjonalnie) minimalną szerokość wyświetlania, a format FormatString wskazuje format (opcjonalny). Jeśli szerokość sformatowanej wartości przekracza określoną szerokość, szerokość jest odpowiednio zwiększana. Wartości, których pozycje nie są przywoływyne w funkcji FormatString , są ignorowane po oszacowaniu pod uwagę wszelkich efektów ubocznych. Jeśli N odwołuje się do nieistniejącej pozycji, zachowanie jest definiowane przez implementację. Wartość typu i void $null są formatowane jako puste ciągi. Tablice są sformatowane jako wyrażenie podrzędne (";7.1.6). Aby uwzględnić znaki "{" i "}" w specyfikacji formatu bez ich interpretowania jako ograniczników formatu, zapisz je odpowiednio jako "{{" i "}}".

Pełną definicję specyfikacji formatu można znaleźć w temacie Type (Typ) System.IFormattable w temacie Ecma Technical Report TR/84 (Raport techniczny ecma TR/84).

Przykłady:

`$i` = 10; $j = 12
"{2} <= {0} + {1}\`n" -f $i,$j,($i+$j)  # 22 <= 10 + 12
">{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 % <
$format = ">{0:x8}<"
$format -f 123455                       # >0001e23f<

W specyfikacji formatu, jeśli N odnosi się do nieistniejącej pozycji, jest wywoływana pozycja FormatError .

7.6 Operatory mnożenia

Składnia:

multiplicative-expression:
    format-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 Mnożenie

Opis:

Wynikiem operatora * mnożenia jest iłoczyn wartości wyznaczonych przez dwa operandy po zastosowaniu zwykłych konwersji arytmetycznych (ację 6,15).

Ten operator pozostaje asocjacyjny.

Przykłady:

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 Replikacja ciągów

Opis:

Gdy lewy operand wyznacza ciąg, operator binarny tworzy nowy ciąg zawierający ciąg wyznaczony przez lewy operand * zreplikowany liczbę razy wyznaczoną przez wartość prawego operandu jako przekonwertowaną na typ całkowity (";6,4).

Ten operator pozostaje asocjacyjny.

Przykłady:

"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 Replikacja tablic

Opis:

Gdy lewy operand * wyznacza tablicę, operator binarny tworzy nową nieprzeszkoloną tablicę 1-wymiarową zawierającą wartość wyznaczoną przez lewy operand zreplikowany liczbę razy wyznaczoną przez wartość prawego operandu jako przekonwertowaną na typ całkowity (";6,4). Liczba replikacji równa zero powoduje tablicę o długości 1. Jeśli lewy operand wyznacza tablicę wielowymiarową, jest ona spłaszczona ([9,12] przed jej rozpoczęciem.

Ten operator pozostaje asocjacyjny.

Przykłady:

$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 Dzielenie

Opis:

/ Wynik operatora dzielenia jest ilorazem, gdy wartość wyznaczona przez lewy operand jest dzielona przez wartość wyznaczoną przez prawy operand po zastosowaniu zwykłych konwersji arytmetycznych ([6,15].

W przypadku próby wykonania dzielenia liczby całkowitej lub dziesiętnej przez zero jest wywoływany błąd zakończenia zdefiniowany przez implementację.

Ten operator pozostaje asocjacyjny.

Przykłady:

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

W przypadku próby wykonania dzielenia liczby całkowitej lub dziesiętnej przez zero jest wywoływany wyjątek RuntimeException .

7.6.5 Reszta

Opis:

% Wynik operatora reszty jest resztą, gdy wartość wyznaczona przez lewy operand jest dzielona przez wartość wyznaczoną przez prawy operand po zastosowaniu zwykłych konwersji arytmetycznych ([6,15].

W przypadku próby wykonania dzielenia liczby całkowitej lub dziesiętnej przez zero jest wywoływany błąd zakończenia zdefiniowany przez implementację.

Przykłady:

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

W przypadku próby wykonania dzielenia liczby całkowitej lub dziesiętnej przez zero jest wywoływany wyjątek RuntimeException .

7.7 Operatory dodatku

Składnia:

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

7.7.1 Dodawanie

Opis:

Wynikiem operatora + dodatku jest suma wartości wyznaczonych przez dwa argumenty operandów po zastosowaniu zwykłych konwersji arytmetycznych ();6,15).

Ten operator pozostaje asocjacyjny.

Przykłady:

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 Concatentaion ciągów

Opis:

Gdy lewy operand wyznacza ciąg, operator binarny tworzy nowy ciąg zawierający wartość wyznaczoną przez lewy operand, po + którym natychmiast następuje wartości wyznaczone przez prawy operand jako przekonwertowane na ciąg typu (";6.8).

Ten operator pozostaje asocjacyjny.

Przykłady:

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

7.7.3. Konkasowanie tablic

Opis:

Gdy lewy operand + wyznacza tablicę, operator binarny tworzy nową nieprzeszkoloną tablicę 1-wymiarową, która zawiera elementy wyznaczone przez lewy operand, a następnie wartości wyznaczone przez prawy operand. Tablice wielowymiarowe obecne w obu operandach są spłaszczone ([9,12] przed ich rozpoczęciem.

Ten operator pozostaje asocjacyjny.

Przykłady:

$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 Konkasowanie tablicy skrótów

Opis:

Gdy oba operandy wyznaczają tablice skrótów + , operator binarny tworzy nową tablicę skrótów zawierającą elementy wyznaczone przez lewy operand, po których natychmiast następuje elementy wyznaczone przez prawy operand.

Jeśli tablice skrótów zawierają ten sam klucz, zostanie podniesiony błąd zakończenia zdefiniowany przez implementację.

Ten operator pozostaje asocjacyjny.

Przykłady:

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

Jeśli tablice skrótów zawierają ten sam klucz, zostanie podniesiony wyjątek typu BadOperatorArgument .

7.7.5 Odejmowanie

Opis:

- Wynik operatora odejmowania jest różnicą, gdy wartość wyznaczona przez prawy operand jest odejmowana od wartości wyznaczonej przez lewy operand po zastosowaniu zwykłych konwersji arytmetycznych (ację 6,15).

Ten operator pozostaje asocjacyjny.

Przykłady:

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

7.8 Operatory porównania

Składnia:

comparison-operator: one of
    dash as           dash ccontains     dash ceq
    dash cge          dash cgt           dash cle
    dash clike        dash clt           dash cmatch
    dash cne          dash cnotcontains  dash cnotlike
    dash cnotmatch    dash contains      dash creplace
    dash csplit       dash eq            dash ge
    dash gt           dash icontains     dash ieq
    dash ige          dash igt           dash ile
    dash ilike        dash ilt           dash imatch
    dash in           dash ine           dash inotcontains
    dash inotlike     dash inotmatch     dash ireplace
    dash is           dash isnot         dash isplit
    dash join         dash le            dash like
    dash lt           dash match         dash ne
    dash notcontains  dash notin         dash notlike
    dash notmatch     dash replace       dash shl
    dash shr          dash split

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

Opis:

Typ wartości wyznaczonej przez lewy operand określa, jak wartość wyznaczona przez prawy operand jest konwertowana ();6), jeśli to konieczne, przed porównaniem.

Niektóre operatory porównania (zapisane tutaj jako -op) mają dwa warianty: jeden z wielkością liter (-cop) i jeden, który nie jest (-iop). Wersja -op jest równoważna -iop. Znaczenie wielkości liter ma znaczenie tylko w przypadku porównań wartości typu ciąg. W kontekstach porównania innych niż ciągi dwa warianty zachowują się tak samo.

Te operatory są pozostawiane jako asocjacyjne.

7.8.1 Operatory równości i relacyjne

Opis:

Istnieją dwa operatory równości: równość (-eq) i nierówności (-ne); i cztery operatory relacyjne : operatory mniejsze niż (-lt), mniejsze niż lub równe (-le), większe niż (-gt) i większe niż lub równe (-ge). Każdy z nich ma dwa warianty (";7,8).

Aby dwa ciągi były porównywane jako równe, muszą mieć taką samą długość i zawartość oraz literę, jeśli jest to konieczne.

Jeśli wartość wyznaczona przez lewy operand nie jest kolekcją, wynik ma typ bool. W przeciwnym razie wynikiem jest prawdopodobnie pusta, nieprzetrenowana tablica jednowymiarowa zawierająca elementy kolekcji, które testuje wartość True w porównaniu z wartością wyznaczoną przez prawy operand.

Przykłady:

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 Operatory zawierania

Opis:

Istnieją cztery operatory zawierania: contains (-contains), does-not-contain (‑notcontains), in (-in) and not-in (-notin). Każdy z nich ma dwa warianty (";7.8).

Operatory zawierania zwracają wynik typu bool, który wskazuje, czy wartość występuje (lub nie występuje) co najmniej raz w elementach tablicy. W -contains przypadku elementów ‑notcontainsi wartość jest wyznaczana przez prawy operand, a tablica jest wyznaczana przez lewy operand. W przypadku argumentów -notin-in i operandy są odwrócone. Wartość jest wyznaczana przez lewy operand, a tablica jest wyznaczana przez prawy operand.

Na potrzeby tych operatorów, jeśli operand tablicy ma wartość skalarną, wartość skalarna jest traktowana jako tablica jednego elementu.

Przykłady:

10,20,30,20,10 -contains 20     # True
10,20,30,20,10 -contains 42.9   # False
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 Operatory testowania i konwersji typów

Opis:

Operator typu sprawdza -is , czy wartość wyznaczona przez lewy operand ma typ lub pochodzi od typu, który ma typ wyznaczony przez prawy operand. Prawy operand musi wyznaczyć typ lub wartość, która może zostać przekonwertowana na typ (na przykład ciąg, który nada typowi nazwę). Typ wyniku to bool. Operator typu zwraca -isnot logiczną negację odpowiadającego formularza -is .

Operator typu próbuje -as przekonwertować wartość wyznaczoną przez lewy operand na typ wyznaczony przez prawy operand. Prawy operand musi wyznaczyć typ lub wartość, która może zostać przekonwertowana na typ (na przykład ciąg, który nada typowi nazwę). Jeśli konwersja zakończy się niepowodzeniem, $null zwracana jest wartość ; w przeciwnym razie zwracana jest przekonwertowana wartość, a zwracany typ tego wyniku jest typem środowiska uruchomieniowego przekonwertowanej wartości.

Przykłady:

$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 Dopasowywanie wzorców i operatory manipulowania tekstem

7.8.4.1 Operatory -like i -notlike

Opis:

Jeśli lewy operand nie wyznacza kolekcji, wynik ma typ bool. W przeciwnym razie wynikiem jest potencjalnie pusta, nieprzetrenowana tablica 1-wymiarowa zawierająca elementy kolekcji, które testuje wartość True w porównaniu z wartością wyznaczoną przez prawy operand. Prawy operand może wyznaczyć ciąg zawierający wyrażenia z symbolami wieloznacznych (";3.15). Te operatory mają dwa warianty (";7.8).

Przykłady:

"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 Operatory -match i -notmatch

Opis:

Jeśli lewy operand nie wyznaczy kolekcji, bool $truewynik ma typ, a jeśli wynik to , $matches elementy tablicy skrótów są ustawiane na ciągi, które pasują (lub nie pasują) do wartości wyznaczonej przez prawy operand. W przeciwnym razie wynikiem jest potencjalnie pusta, nieprzetrenowana tablica 1-wymiarowa zawierająca elementy kolekcji, które testuje wartość True w porównaniu z wartością wyznaczoną przez prawy operand i $matches nie jest ustawiona. Prawy operand może wyznaczyć ciąg zawierający wyrażenia regularne ([3.16], w którym to przypadku jest określany jako wzorzec. Te operatory mają dwa warianty (";7.8).

Te operatory obsługują podpaski (";7.8.4.6).

Przykłady:

"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

Opis:

Operator -replace umożliwia zamianę tekstu w co najmniej jednym ciągu wyznaczonym przez lewy operand przy użyciu wartości wyznaczonych przez prawy operand. Ten operator ma dwa warianty (";7,8). Prawy operand ma jedną z następujących form:

  • Ciąg do zlokalizowania, który może zawierać wyrażenia regularne (";3.16). W tym przypadku ciąg zastępczy jest niejawnie "".
  • Tablica 2 obiektów zawierająca ciąg do zlokalizowania, po której następuje ciąg zastępczy.

Jeśli lewy operand wyznaczy ciąg, wynik ma ciąg typu. Jeśli lewy operand wyznacza 1-wymiarową tablicę ciągu, wynikiem jest nieprzetrenowana tablica 1-wymiarowa, której długość jest taka sama jak w przypadku tablicy lewego operandu, zawierająca ciągi wejściowe po zakończeniu zastępowania.

Ten operator obsługuje podpaski (";7.8.4.6).

Przykłady:

"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 Binarny operator -join

Opis:

Operator binarny -join tworzy ciąg, który jest ujednorzeniem wartości jednego lub większej liczby obiektów wyznaczonych przez lewy operand po przekonwertowaniu na ciąg (=6,7), jeśli jest to konieczne. Ciąg wyznaczony przez prawy operand jest używany do oddzielania (potencjalnie pustych) wartości w ciągu wynikowym.

Lewy operand może być wartością skalarną lub kolekcją.

Przykłady:

(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 podziału binarnego

Opis:

Operator binarny -split dzieli jeden lub więcej ciągów wyznaczonych przez lewy operand, zwracając ich części podrzędne w ograniczonej 1-wymiarowej tablicy ciągu. Ten operator ma dwa warianty (";7,8). Lewy operand może wyznaczyć wartość skalarną lub tablicę ciągów. Prawy operand ma jedną z następujących form:

  • Ciąg ogranicznika
  • Tablica 2 obiektów zawierająca ciąg ogranicznika, po którym następuje liczbowa liczba podziałów
  • Tablica 3 obiektów zawierająca ciąg ogranicznika, liczbową liczbę podziałów i ciąg opcji
  • Blok skryptu
  • Tablica 2 obiektów zawierająca blok skryptu, po którym następuje liczbowa liczba podziałów

Ciąg ogranicznika może zawierać wyrażenia regularne (";3.16). Służy do lokalizowania części podrzędnych z ciągami wejściowymi. Ogranicznik nie jest uwzględniony w wynikowych ciągach. Jeśli lewy operand wyznacza pusty ciąg, powoduje to pusty element ciągu. Jeśli ciąg ogranicznika jest pustym ciągiem, znajduje się on w każdej pozycji znaku w ciągach wejściowych.

Domyślnie wszystkie części podrzędne ciągów wejściowych są umieszczane w wyniku jako oddzielne elementy; Jednak liczba podziałów może służyć do modyfikowania tego zachowania. Jeśli ta liczba jest ujemna, zero lub większa niż lub równa liczbie części podrzędnych w ciągu wejściowym, każda część podrzędna przechodzi do oddzielnego elementu. Jeśli ta liczba jest mniejsza niż liczba części podrzędnych w ciągu wejściowym, wynik zawiera elementy zliczania, a ostatni element zawiera wszystkie części podrzędne poza pierwszą liczbą — 1 część podrzędna.

Ciąg opcji zawiera zero lub więcej nazw opcji z każdą przyległą parą oddzieloną przecinkiem. Wiodące, końcowe i osadzone białe spacje są ignorowane. Nazwy opcji mogą być w dowolnej kolejności i zróżnicują wielkość liter.

Jeśli ciąg opcji zawiera nazwę opcji SimpleMatch, może również zawierać nazwę opcji IgnoreCase. Jeśli ciąg opcji zawiera nazwę opcji RegexMatch lub nie zawiera wyrażenia RegexMatch lub SimpleMatch, może zawierać dowolną nazwę opcji z wyjątkiem SimpleMatch. Nie może jednak zawierać zarówno wieloliniowego, jak i jednoliniowego.

Oto zestaw nazw opcji:

Opcja Opis
CultureInvariant Ignoruje różnice kulturowe w języku podczas oceniania ogranicznika.
ExplicitCapture Ignoruje nienazwansowane grupy dopasowania, dzięki czemu na liście wyników są zwracane tylko jawne grupy przechwytywania.
IgnoreCase Wymuszaj dopasowywanie bez uwzględniania liter, nawet jeśli -csplit jest używane.
IgnorePatternWhitespace Ignoruje nieziemskie białe znaki i komentarze oznaczone znakiem numeru (#).
Multiline Ten tryb rozpoznaje początek i koniec wierszy i ciągów. Tryb domyślny to Singleline.
RegexMatch Użyj dopasowywania wyrażeń regularnych, aby ocenić ogranicznik. Jest to opcja domyślna.
SimpleMatch Użyj prostego porównania ciągów podczas obliczania ogranicznika.
Jednoliniowy Ten tryb rozpoznaje tylko początek i koniec ciągów. Jest to tryb domyślny.

Blok skryptu ([7.1.8) określa reguły określania ogranicznika i musi oszacować wartość typu bool.

Przykłady:

"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 Podpaski

Wzorzec jest dopasowywana do -matchelementu , -notmatchi -replace może zawierać części podrzędne (nazywane podpasami) rozdzielone nawiasami. Rozpatrzmy następujący przykład:

"red" -match "red"

Wynik to , $true a klucz 0 $matches zawiera "czerwony", czyli część ciągu wyznaczoną przez lewy operand, który dokładnie pasuje do wzorca wyznaczonego przez prawy operand.

W poniższym przykładzie cały wzorzec jest podpasmem:

"red" -match "(red)"

Tak jak poprzednio, klucz 0 zawiera "czerwony"; Jednak klucz 1 zawiera również "czerwony", czyli część ciągu wyznaczoną przez lewy operand, który dokładnie pasuje do podpaski.

Rozważmy następujący, bardziej złożony wzorzec:

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

Ten wzorzec umożliwia niedopasowania "r", "re", "d" lub "red".

Ponownie klucz 0 zawiera "czerwony". Klucz 1 zawiera "re", klucz 2 zawiera "r", a klucz 3 zawiera "d". Pary klucz/wartość są zgodne w kolejności od lewej do prawej we wzorcu, a dłuższe dopasowania ciągów poprzedzają krótsze.

W przypadku , -replacetekst $nzastępczy może uzyskać dostęp do podzadań za pośrednictwem nazw formularza , $1gdzie pierwsze dopasowanie to , $3drugi to , i tak dalej. Na przykład

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

Wynikowy ciąg to "rano w poniedziałek".

Zamiast mieć klucze w indeksach $matches opartych na zerach, można nazwać podpaski przy użyciu formularza ?<*name*>. Na przykład można "((r)e)(d)" je zapisywać z trzema nazwami podpasek: m1, m2 i m3 w następujący sposób: "(?<m1>(?<m2>r)e)(?<m3>d)".

7.8.5 Operatory przesunięcia

Opis:

Operator przesunięcia w lewo (-shl) i operator przesunięcia w prawo (-shr) konwertują wartość zaprojektowaną przez lewy operand na typ całkowity, a wartość wyznaczoną przez prawy operand na liczbę całkowitą, w razie potrzeby przy użyciu zwykłych konwersji arytmetycznych (%).6,15).

Operator przesunięcia w lewo przesuwa lewy operand w lewo o liczbę bitów obliczoną zgodnie z poniższym opisem. Puste pozycje bitów o niskiej kolejności są ustawione na zero.

Operator przesunięcia w prawo przesuwa lewy operand w prawo o liczbę bitów obliczoną zgodnie z poniższym opisem. Bity niskiego porządku lewego operandu są odrzucane, a pozostałe bity przesunięte w prawo. Gdy lewy operand jest wartością ze podpisem, puste pozycje bitów wysokiego poziomu są ustawiane na zero, jeśli lewy operand jest nieujemny i ustawiony na jeden, jeśli lewy operand jest ujemny. Gdy lewy operand jest wartością niepodpisaną, puste pozycje bitów wysokiego poziomu są ustawiane na zero.

Gdy lewy operand ma typ int, liczba przesunięcia jest podana przez pięć bitów prawego operandu w niskiej kolejności. Gdy prawy operand ma długi typ, liczba przesunięcia jest nadawać przez sześć bitów niskiego porządku prawego operandu.

Przykłady:

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

Operatory bitowe 7.9

Składnia:

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

Opis:

Operator bitowy AND -band, bitowy operator -borOR i bitowy operator XOR -bxor konwertują wartości wyznaczone przez ich operandy na typy całkowite, w razie potrzeby przy użyciu zwykłych konwersji arytmetycznych (";6,15). Po konwersji, jeśli obie wartości mają typ int, który jest typem wyniku. W przeciwnym razie, jeśli obie wartości mają typ długi, jest to typ wyniku. Jeśli jedna wartość ma typ int, a druga ma typ long, typ wyniku jest długi. W przeciwnym razie wyrażenie nie jest formowane. Wynikiem jest bitowe AND, bitowe OR lub bitowe XOR, odpowiednio, wartości ewentualnie przekonwertowanych operandów.

Te operatory są pozostawiane jako asocjacyjne. Są one commutacyjne, jeśli żaden operand nie zawiera efektu ubocznego.

Przykłady:

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 Operatory logiczne

Składnia:

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

Opis:

Operator logiczny AND konwertuje -and wartości wyznaczone przez jego operandy boolna , jeśli to konieczne (";6.2). Wynik jest wartością logiczną AND potencjalnie przekonwertowanych wartości operandów i ma typ bool. Jeśli lewy operand ma wartość False, prawy operand nie jest oceniany.

Operator logiczny OR konwertuje -or wartości wyznaczone przez jego operandy boolna , jeśli to konieczne (";6.2). Wynikiem jest wartość logiczna OR potencjalnie przekonwertowanych wartości operandów i typ bool. Jeśli lewy operand ma wartość True, prawy operand nie jest oceniany.

Logiczny operator -xor XOR konwertuje wartości wyznaczone przez jego operandy na bool (%).6.2). Wynik jest logicznym XOR prawdopodobnie przekonwertowanych wartości operandów i ma typ bool.

Te operatory są pozostawiane jako asocjacyjne.

Przykłady:

$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 Operatory przypisania

Składnia:

assignment-expression:
    expression assignment-operator statement

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

Opis:

Operator przypisania przechowuje wartość w zapisywalnym miejscu wyznaczonym przez wyrażenie. Aby uzyskać omówienie operatora przypisania=, zobacz .7.11.1. Omówienie wszystkich innych operatorów przypisania można znaleźć w te tematach :7.11.2.

Wyrażenie przypisania ma wartość wyznaczoną przez wyrażenie po przypisaniu. Jednak to wyrażenie przypisania samo w sobie nie wyznacza zapisywaowalnej lokalizacji. Jeśli wyrażenie jest ograniczone do typu ();5.3), typ używany w tym ograniczeniu jest typem wyniku; W przeciwnym razie typ wyniku jest typem po zastosowaniu zwykłych konwersji arytmetycznych (=6,15).

Ten operator ma rację asocjacyjny.

7.11.1 Proste przypisanie

Opis:

W prostym przypisaniu (=) wartość wyznaczona przez instrukcje zastępuje wartość przechowywaną w zapisywalnym miejscu wyznaczonym przez wyrażenie. Jeśli jednak wyrażenie wyznacza nieistniejący klucz w tablicy skrótów, ten klucz jest dodawany do tablicy skrótów ze skojarzoną wartością wartości wyznaczoną przez instrukcje .

Jak pokazuje gramatyka, wyrażenie może wyznaczyć rozdzielaną przecinkami listę zapisywalnych lokalizacji. Jest to nazywane przypisanością wielokrotną. Instrukcja wyznacza listę co najmniej jednej wartości rozdzielanych przecinkami. Przecinki na obu listach operandów są częścią składni wielokrotnego przypisania i nie reprezentują operatora przecinka binarnego. Wartości są brane z listy wyznaczonej przez instrukcje w kolejności leksykacznej i przechowywane w odpowiedniej zapisywalnej lokalizacji wyznaczonej przez wyrażenie. Jeśli lista wyznaczona przez instrukcji ma mniej wartości niż istnieją lokalizacje, w których można zapisywać wyrażenia, nadmiarowe lokalizacje przejmują wartość $null. Jeśli lista wyznaczona przez instrukcji ma więcej wartości niż istnieje lokalizacje z zapisywalnymi wyrażeniami, wszystkie lokalizacje wyrażeń poza lokalizacją najbardziej po prawej stronie przejmują odpowiadającą jej wartość instrukcji, a lokalizacja wyrażenia najbardziej po prawej stronie staje się nieprzeszkoloną tablicą 1-wymiarową ze wszystkimi pozostałymi wartościami instrukcji jako elementami.

W przypadku instrukcji, które mają wartości ();8.1.2), instrukcja może być instrukcjeem.

Przykłady:

$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 Przypisanie złożone

Opis:

Przypisanie złożone ma postać E1 op= E2i E1 = E1 op (E2) jest równoważne prostego wyrażenia przypisania, z tą różnicą, że w przypadku przypisania złożonego wyrażenie E1 jest oceniane tylko raz. Jeśli wyrażenie jest ograniczone do typu ();5.3), typ używany w tym ograniczeniu jest typem wyniku; w przeciwnym razie typ wyniku jest określany przez op. *=W przypadku , zobacz .7.6.1, ?7.6.2, .7.6.3; dla /=, zobacz .7.6.4; %=w przypadku , zobacz .7.6.5; +=w przypadku , zobacz .7.7.1, ?7.7.2, ?7.7.3; -=w przypadku , zobacz .7.7.5.

Uwaga

Operand wyznaczający niewyszkoloną wartość typu liczbowego może ulec zmianie przez operator przypisania, gdy wynik jest przechowywany.

Przykłady:

$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 Operatory przekierowania

Składnia:

pipeline:
    assignment-expression
    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

Opis:

Operator przekierowania > pobiera standardowe dane wyjściowe z potoku i przekierowuje je do lokalizacji wyznaczonej przez przekierowanie-nazwa-pliku, co nadpisuje bieżącą zawartość tej lokalizacji.

Operator przekierowania >> pobiera standardowe dane wyjściowe z potoku i przekierowuje je do lokalizacji wyznaczonej przez redirected-file-name, dołączając ją do bieżącej zawartości tej lokalizacji, jeśli taka jest obecna. Jeśli ta lokalizacja nie istnieje, zostanie utworzona.

Operator przekierowania n> z formularzem pobiera dane wyjściowe strumienia n z potoku i przekierowuje go do lokalizacji wyznaczonej przez redirected-file-name, co nadpisuje bieżącą zawartość tej lokalizacji.

Operator przekierowania n>> z formularzem pobiera dane wyjściowe strumienia n z potoku i przekierowuje go do lokalizacji wyznaczonej przez redirected-file-name, dołączając ją do bieżącej zawartości tej lokalizacji, jeśli taka jest obecna. Jeśli ta lokalizacja nie istnieje, zostanie utworzona.

Operator przekierowania z formularzem m>&n zapisuje dane wyjściowe ze strumienia m w tej samej lokalizacji co strumień n.

Poniżej przedstawiono prawidłowe strumienie:

Stream Opis
1 Standardowy strumień wyjściowy
2 Strumień wyjściowy błędu
3 Strumień wyjściowy ostrzeżenia
4 Pełny strumień wyjściowy
5 Debugowanie strumienia wyjściowego
* Standardowe dane wyjściowe, dane wyjściowe błędu, dane wyjściowe ostrzeżenia, pełne dane wyjściowe i debugowanie strumieni wyjściowych

Operatory przekierowania 1>&2, 6>i 6>>< zarezerwowane do użytku w przyszłości.

Jeśli w danych wyjściowych wartość redirected-file-name to $null, dane wyjściowe są odrzucane.

Zwykle wartość wyrażenia zawierającego efekt uboczny najwyższego poziomu nie jest zapisywana w potoku, chyba że to wyrażenie jest ujęte w parę nawiasów. Jeśli jednak takie wyrażenie jest lewym operandem operatora, który przekierowuje standardowe dane wyjściowe, wartość jest zapisywana.

Przykłady:

$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