7. Uttryck
Syntax:
expression:
logical-expression
Beskrivning:
Ett uttryck är en sekvens med operatorer och operander som anger en metod, en funktion, en skrivbar plats eller ett värde. anger beräkningen av ett värde. genererar en eller flera sidoeffekter, eller utför någon kombination av dessa. Exempel:
- Literalen 123 är ett uttryck som anger int-värdet 123.
- Uttrycket anger
1,2,3,4
matrisobjektet med 4 element som har de värden som visas. - Uttrycket anger
10.4 * $a
en beräkning. - Uttrycket ger
$a++
en sidoeffekt. - Uttrycket utför
$a[$i--] = $b[++$j]
en kombination av dessa saker.
Förutom vad som anges för vissa operatorer är utvärderingsordningen för termer i ett uttryck och i vilken ordning sidoeffekter sker ospecificerade. Exempel på ospecificerade beteenden är: $i++ + $i
, $i + --$i
och $w[$j++] = $v[$j]
.
En implementering av PowerShell kan ge stöd för användardefinierade typer och dessa typer kan ha åtgärder som definierats för dem. All information om sådana typer och åtgärder är implementeringsdefinierad.
Ett uttryck på den översta nivån är ett uttryck som inte ingår i ett större uttryck. Om ett uttryck på den översta nivån innehåller en bieffektsoperator skrivs inte värdet för uttrycket till pipelinen. annars är det det. Se 7.1.1 för en detaljerad beskrivning av detta.
Normalt räknas ett uttryck som anger en samling (4) upp i dess komponenter när värdet för uttrycket används. Detta är dock inte fallet när uttrycket är en cmdlet-anrop. Exempel:
$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
I de två första $(...)
användningsområdena för operatorn $x
är uttrycket som anger samlingen variabeln , som räknas int
upp, vilket resulterar i tre värden plus int
99. Men i det tredje fallet är uttrycket ett direkt anrop till en cmdlet, så resultatet räknas inte upp och $a
är en matris med två element, int[3]
och int
.
Om en åtgärd inte definieras av PowerShell kontrolleras den typ av värde som anges av den vänstra operanden för att se om den har en motsvarande op_<operation>
metod.
7.1 Primära uttryck
Syntax:
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 Grupperingsparenteser
Syntax:
Tips
Notationen ~opt~
i syntaxdefinitionerna anger att den lexikala entiteten är valfri i syntaxen.
parenthesized-expression:
( new-lines~opt~ pipeline new-lines~opt~ )
Beskrivning:
Ett parentesuttryck är ett primärt uttryck vars typ och värde är samma som uttryckets utan parenteser. Om uttrycket anger en variabel anger det parentesiserade uttrycket samma variabel. Till exempel är $x.m
och ($x).m
likvärdiga.
Gruppering av parenteser kan användas i ett uttryck för att dokumentera standardvärdet för prioritet och associativitet i uttrycket. De kan också användas för att åsidosätta standardinställningen och associativiteten. Exempel:
4 + 6 * 2 # 16
4 + (6 * 2) # 16 document default precedence
(4 + 6) * 2 # 20 override default precedence
Normalt är gruppering av parenteser på den översta nivån redundant. Det är dock inte alltid fallet. Se följande exempel:
2,4,6 # Length 3; values 2,4,6
(2,4),6 # Length 2; values [object[]],int
I det andra fallet ändrar parenteserna semantiken, vilket resulterar i en matris vars två element är en matris med 2 int och skalär int 6.
Här är ett annat undantag:
23.5/2.4 # pipeline gets 9.79166666666667
$a = 1234 * 3.5 # value not written to pipeline
$a # pipeline gets 4319
I det första och tredje fallen skrivs resultatets värde till pipelinen. Även om uttrycket i det andra fallet utvärderas skrivs inte resultatet till pipelinen på grund av förekomsten av sidoeffektsoperatorn = på den översta nivån. (Borttagning av delen $a =
gör att värdet kan skrivas, eftersom det *
inte är en bieffektsoperator.)
Om du vill stoppa ett värde för uttryck som inte innehåller sidoeffekter på den översta nivån från att skrivas till pipelinen tar du bort det explicit, enligt följande:
# None of these value are written to pipeline
[void](23.5/2.4)
[void]$a
$null = $a
$a > $null
Om du vill skriva värdet för ett uttryck som innehåller sidoeffekter på den översta nivån till pipelinen omsluter du uttrycket inom parentes, enligt följande:
($a = 1234 * 3.5) # pipeline gets 4319
Därför är grupperingsparenteserna i det här fallet inte redundanta.
I följande exempel har vi variabelersättning (2.3.5.2) som sker i en stränglitteral:
">$($a = -23)<" # value not written to pipeline, get
><
">$(($a = -23))<" # pipeline gets >-23<
I det första fallet representerar parenteserna ett underuttrycks avgränsare som inte grupperar parenteser, och eftersom uttrycket på den översta nivån innehåller en bieffektsoperator skrivs uttryckets värde inte till pipelinen. Naturligtvis är tecknen >
och <
fortfarande skrivna.) Om parenteser för gruppering läggs till, vilket visas i det andra fallet, aktiveras skrivning.
Följande exempel innehåller var och en av de översta operatorerna för sidoeffekt:
$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
Användningen av gruppering av parenteser runt ett uttryck som inte innehåller några sidoeffekter på den översta nivån gör dessa parenteser redundanta. Till exempel;
$a # pipeline gets 0
($a) # no side effect, so () redundant
Titta på följande exempel som har två sidoeffekter, och ingen av dem är på den översta nivån:
12.6 + ($a = 10 - ++$b) # pipeline gets 21.6.
Resultatet skrivs till pipelinen eftersom uttrycket på den översta nivån inte har några sidoeffekter.
7.1.2 Medlemsåtkomst
Syntax:
member-access: Note no whitespace is allowed after primary-expression.
primary-expression . member-name
primary-expression :: member-name
Beskrivning:
Operatorn .
används för att välja en instansmedlem från ett -objekt eller en nyckel från en Hashtable
.
Den vänstra operanden måste ange ett -objekt, och den högra operanden måste ange en tillgänglig instansmedlem.
Antingen anger den högra operanden en tillgänglig instansmedlem inom den typ av objekt som anges av den vänstra operanden eller, om den vänstra operanden anger en matris, anger den högra operanden tillgängliga instansmedlemmar inom varje element i matrisen.
Blanksteg tillåts inte före operatorn .
.
Operatorn lämnas associativ.
Operatorn ::
används för att välja en statisk medlem från en viss typ. Den vänstra operanden måste ange en typ, och den högra operanden måste ange en tillgänglig statisk medlem inom den typen.
Blanksteg tillåts inte före operatorn ::
.
Operatorn lämnas associativ.
Om den högra operanden anger en skrivbar plats inom den typ av objekt som anges av den vänstra operanden, anger hela uttrycket en skrivbar plats.
Exempel:
$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 Anropsuttryck
Syntax:
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~ )
Beskrivning:
Ett anropsuttryck anropar metoden som anges av primary-expression. member-name or primary-expression::member-name. Parenteserna i argument-list innehåller en eventuellt tom, kommaavgränsad lista över uttryck, som anger de argument vars värden skickas till metoden. Innan metoden anropas utvärderas argumenten och konverteras enligt reglerna för -6, om det behövs, för att matcha de typer som förväntas av metoden. Utvärderingsordningen för primary-expression. member-name, primary-expression::member-name och argumenten är ospecificerade.
Operatorn lämnas associativ.
Typen av resultat av ett anropsuttryck är en metoddesignerare (4.5.24).
Exempel:
[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 Elementåtkomst
Syntax:
element-access: Note no whitespace is allowed between primary-expression and [.
primary-expression [ new-lines~opt~ expression new-lines~opt~ ]
Beskrivning:
Det får inte finnas något tomt utrymme mellan primary-expression och vänster hakparentes ([
).
7.1.4.1 Nedsänka en matris
Beskrivning:
Matriser beskrivs i detalj i -9. Om uttrycket är en 1-dimensionell matris, se 7.1.4.5.
När primary-expression anger en 1-dimensionell matris A returnerar operatorn []
elementet A[0 + expression]
som finns på efter att värdet för uttrycket har konverterats till int
.
Resultatet har elementtypen för matrisen som är nedsänkt. Om uttrycket är negativt anger A[expression]
elementet som finns på A[A.Length + expression]
.
När primary-expression anger en 2-dimensionell matris B returnerar []
B[0 + row,0 + column]
operatorn elementet som finns på efter att värdet för rad- och kolumnkomponenterna i uttrycket (som anges som en kommaavgränsad lista) har konverterats till int
. Resultatet har elementtypen för matrisen som är nedsänkt. Till skillnad från en 1-dimensionell matris har negativa positioner ingen särskild betydelse.
När primary-expression anger en matris med tre eller flera dimensioner tillämpas reglerna för tvådimensionella matriser och dimensionspositionerna anges som en kommaavgränsad lista med värden.
Om du försöker få läsbehörighet för ett icke-befintligt element blir resultatet $null
. Det är ett fel att skriva till ett element som inte finns.
För ett flerdimensionellt subscript-uttryck med matris är utvärderingsordningen för dimensionspositionsuttrycken ospecificerad. Om du till exempel har en 3-dimensionell matris $a
är beteendet $a[$i++,$i,++$i]
för ospecificerat.
Om uttrycket är en matris, se 7.1.4.5.
Den här operatorn lämnas associativ.
Exempel:
$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]
Om ett försök görs att skriva åtkomst till ett icke-befintligt element utlöses ett IndexOutOfRange-undantag .
7.1.4.2 Nedsänka en sträng
Beskrivning:
När primary-expression anger en sträng S returnerar operatorn []
tecknet som finns i den nollbaserade positionen som anges av uttryck som ett tecken. Om uttrycket är större än eller lika med strängens längd blir resultatet $null
. Om uttrycket är negativt anger S[expression]
elementet som finns på S[S.Length + expression]
.
Exempel:
$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 Nedsänka en hash-tabell
Beskrivning:
När primary-expression anger en Hashtable returnerar operatorn []
de värden som är associerade med de nycklar som anges av uttrycket. Typen av uttryck är inte begränsad.
När uttrycket är ett enskilt nyckelnamn är resultatet det associerade värdet och har den typen, såvida inte det inte finns någon sådan nyckel, i vilket fall resultatet är $null
. Om $null
används som nyckel är implementeringen definierad. Om uttrycket är en matris med nyckelnamn kan du se .7.1.4.5.
Om uttrycket är en matris kan du se .7.1.4.5.
Exempel:
$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
När uttrycket är ett enskilt nyckelnamn, $null
och om det används som det enda värdet för att skapa en hashtabell, utlöses ett NullArrayIndex-undantag .
7.1.4.4 Uppsänka ett XML-dokument
Beskrivning:
När primary-expression anger ett objekt av typen xml konverteras uttrycket till sträng, om det behövs, och operatorn []
returnerar det första underordnade elementet som har det namn som anges av uttrycket. Typen av uttryck måste vara sträng. Resultatets typ är implementeringen som definierats. Resultatet kan nedsänkas för att returnera dess första underordnade element. Om det inte finns något undergivet element med det namn som anges av uttrycket blir resultatet $null
. Resultatet anger inte en skrivbar plats.
Exempel:
$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`
Typen av resultat är System.Xml.XmlElement
eller System.String
.
7.1.4.5 Generera matrissegment
När primary-expression anger ett objekt av en typ som är uppräkningsbar (·4) eller en hash-tabell, och uttrycket är en 1-dimensionell matris, är resultatet en matrissegment (·9.9) som innehåller elementen i primary-expression som anges av elementen i uttrycket.
När det gäller en hash-tabell innehåller matrissegmentet de associerade värdena för de angivna nycklarna, såvida inte det inte finns någon sådan nyckel, i vilket fall motsvarande element är $null
. Om $null
används som ett nyckelnamn är beteendet implementeringsdefinierat.
Exempel:
$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 : När uttrycket är en samling med två eller flera nyckelnamn, $null
om används som ett nyckelnamn ignoreras den nyckeln och inte har något motsvarande element i den resulterande matrisen.
7.1.5 Operatorer för ökning och ökning av postkorrigeringar
Syntax:
post-increment-expression:
primary-expression ++
post-decrement-expression:
primary-expression dashdash
dashdash:
--
Beskrivning:
Det primära uttrycket måste ange en skrivbar plats som har ett värde av numerisk typ (·4) eller värdet $null
. Om värdet som operanden anger $null
är konverteras det värdet till typen int och värdet noll innan operatorn utvärderas. Typen av värde som anges av primary-expression kan ändras när resultatet lagras. En diskussion om typändring via tilldelning finns i mer information om ändring av typ i .7.11.
Resultatet som skapas av postfixoperatorn ++
är det värde som operanden anger. När resultatet har erhållits ökas värdet som anges av operanden med 1 av lämplig typ.
Typen av resultatet av uttrycket är E++
samma som för resultatet av uttrycket E + 1
(7,7).
Resultatet som skapas av postfixoperatorn --
är det värde som operanden anger. När resultatet har erhållits minskar värdet som operanden anger med 1 av lämplig typ.
Typen av resultatet av uttrycket är E--
samma som för resultatet av uttrycket E - 1
(7,7).
Dessa operatorer lämnas associativa.
Exempel:
$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
Operatorn 7.1.6 $(...)
Syntax:
sub-expression:
$( new-lines~opt~ statement-list~opt~ new-lines~opt~ )
Beskrivning:
Om statement-list utelämnas blir resultatet $null
. Annars utvärderas instruktionslistan . Alla objekt som skrivs till pipelinen som en del av utvärderingen samlas in i en ej tränad 1-dimensionell matris i ordning. Om matrisen med insamlade objekt är tom blir resultatet $null
. Om matrisen med insamlade objekt innehåller ett enda element blir resultatet det elementet. Annars är resultatet den ohämmad 1-dimensionella matrisen med insamlade resultat.
Exempel:
$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)
Operatorn 7.1.7 @(...)
Syntax:
array-expression:
@( new-lines~opt~ statement-list~opt~ new-lines~opt~ )
Beskrivning:
Om statement-list utelämnas är resultatet en ej tränad 1-dimensionell matris med längden noll. Annars utvärderas instruktionslistan och alla objekt som skrivs till pipelinen som en del av utvärderingen samlas in i en ej tränad 1-dimensionell matris i ordning. Resultatet är den (eventuellt tomma) ej tränade 1-dimensionella matrisen.
Exempel:
$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 Skriptblockuttryck
Syntax:
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
Beskrivning:
param-block beskrivs i .8.10.9. named-block-list beskrivs i .8.10.7.
Ett skriptblock är ett namnlöst block med instruktioner som kan användas som en enda enhet. Skriptblock kan användas för att anropa ett kodblock som om det vore ett enda kommando, eller så kan de tilldelas till variabler som kan köras.
Den namngivna blocklistan eller instruktionslistan körs och resultatets typ och värde är typen och värdet för resultatet av dessa instruktionsuppsättningar.
Ett skriptblockuttryck har typen scriptblock (–4.3.7).
Om parameterblock utelämnas är argument som skickas till skriptblocket tillgängliga via $args
(8.10.1).
Under parameterbindningen kan ett skriptblock skickas antingen som ett skriptblockobjekt eller som resultat när skriptblocket har utvärderats. Mer information finns i 6.17 .
7.1.9 Hash-literaluttryck
Syntax:
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
Beskrivning:
Ett hash-literal-uttryck används för att skapa en hash-tabell (–10) med noll eller flera element som vart och ett är ett nyckel/värde-par.
Nyckeln kan ha vilken typ som helst förutom null-typen. De associerade värdena kan ha vilken typ som helst, inklusive null-typen, och vart och ett av dessa värden kan vara ett uttryck som anger önskat värde, inklusive $null
.
Ordningen på nyckel/värde-paren är inte viktig.
Exempel:
$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 }
som skapar två hashtabeller, och $h1
$h2
, som var och en innehåller tre nyckel/värde-par, och en tredje, $h3
, som är tom. Hash-tabellen $h4
har nycklar av olika typer.
7.1.10 Typlitteraluttryck
Syntax:
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 [
Beskrivning:
En typ-literal representeras i en implementering av någon ospecificerad underliggande typ. Därför är ett typnamn en synonym för dess underliggande typ.
Typlitteraler används i ett antal kontexter:
- Ange en explicit konvertering (·6, ·7.2.9)
- Skapa en typbegränsad matris (·9.4)
- Åtkomst till statiska medlemmar i ett objekt (7.1.2)
- Ange en typbegränsning för en variabel (5.3) eller en funktionsparameter (8.10.2)
Exempel:
Exempel på typlitteraler är [int]
, [object[]
och [int[,,]]
. En generisk stacktyp (4.4) som är specialiserad för att innehålla strängar kan skrivas som , int
och en allmän ordlistetyp som är specialiserad för att innehålla nycklar med associerade strängvärden kan skrivas [Stack[string]]
som [Dictionary[int,string]]
.
Typen av en type-literal är System.Type
. Det fullständiga namnet för den typ som Stack[string]
föreslås ovan är System.Collections.Generic.Stack[int]
. Det fullständiga namnet för den typ som Dictionary[int,string]
föreslås ovan är System.Collections.Generic.Dictionary[int,string]
.
7.2 Unary-operatorer
Syntax:
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 En enära kommateckenoperator
Beskrivning:
Den här operatorn skapar en icke-tränad 1-dimensionell matris med ett element vars typ och värde är det för ett endimensionellt uttryck.
Den här operatorn är rätt associativ.
Exempel:
$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 Logiskt INTE
Beskrivning:
Operatorn -not konverterar det värde som anges av unary-expression till typen bool (6.2), om det behövs, och genererar ett resultat av den typen. Om ett unary-expression-värde är True blir resultatet False och vice versa. Operatorn ! är en alternativ stavning för -not.
Den här operatorn är rätt associativ.
Exempel:
-not $true # False
-not -not $false # False
-not 0 # True
-not 1.23 # False
!"xyz" # False
7.2.3 Bitwise NOT
Beskrivning:
Operatorn -bnot konverterar det värde som anges av unary-expression till en heltalstyp (medietyp (6.4), om det behövs. Om det konverterade värdet kan representeras av typen int är det resultattypen. Om det konverterade värdet kan representeras av typen long är det annars resultattypen. Annars är uttrycket dåligt format. Det resulterande värdet är ett komplement till det konverterade värdet.
Den här operatorn är rätt associativ.
Exempel:
-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
Beskrivning:
Ett uttryck av formuläret +unary-expression behandlas som om det skrevs som 0 + unary-expression
(-7.7). Heltalslitteralen 0 har typen int
.
Den här operatorn är rätt associativ.
Exempel:
+123L # type long, value 123
+0.12340D # type decimal, value 0.12340
+"0xabc" # type int, value 2748
7.2.5 Unary minus
Beskrivning:
Ett uttryck av formuläret -unary-expression behandlas som om det skrevs som 0 - unary-expression
(-7.7). Heltalslitteralen 0 har typen int
.
Den här operatorn är rätt associativ.
Exempel:
-$true # type int, value -1 -123L # type long, value -123 -0.12340D # type decimal, value -0.12340
7.2.6 Operatorer för ökning och ökning av prefix
Beskrivning:
Unary-expression måste ange en skrivbar plats som har ett värde av numerisk typ (#4) eller värdet $null
. Om värdet som anges av dess unary-expression $null
är konverteras värdet för ett unary-expression till type int och value zero innan operatorn utvärderas.
Anteckning
Typen av värde som anges av unary-expression kan ändras när resultatet lagras. Se 7.11 för en diskussion om typändring via tilldelning.
För prefixoperatorn ++
ökas värdet för ett unary-expression med 1 av lämplig typ. Resultatet är det nya värdet när inkrement har skett. Uttrycket motsvarar ++E
E += 1
(–7.11.2).
För prefixoperatorn --
minskar värdet för unary-expression med 1 av lämplig typ. Resultatet är det nya värdet efter att minskande har skett. Uttrycket motsvarar --E
E -= 1
(–7.11.2).
Dessa operatorer är rätt associativa.
Exempel:
$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 Operatorn unary -join
Beskrivning:
Den enära -join
operatorn genererar en sträng som är sammanfogningen av värdet för ett eller flera objekt som anges av ett unary-expression. (En avgränsare kan infogas med hjälp av den binära versionen av operatorn (7.8.4.4).)
unary-expression kan vara ett skalärt värde eller en samling.
Exempel:
-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 Operatorn unary -split
Beskrivning:
Den enära -split
operatorn delar upp en eller flera strängar som anges av ett unary-expression och returnerar sina underdelar i en begränsad 1-dimensionell strängmatris. Den behandlar alla sammanhängande grupper med blankstegstecken som avgränsare mellan efterföljande underdelar. (En explicit avgränsarsträng kan anges med hjälp av den binära versionen av operatorn (·7.8.4.5).) Den här operatorn har två varianter (7,8).
Avgränsartexten ingår inte i de resulterande strängarna. Inledande och avslutande blanksteg i indatasträngen ignoreras. En indatasträng som är tom eller som innehåller blanksteg resulterar endast i en matris med 1 sträng, som är tom.
unary-expression kan ange ett skalärt värde eller en matris med strängar.
Exempel:
-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 Cast-operatorn
Beskrivning:
Den här operatorn konverterar explicit (·6) värdet som anges av unary-expression till den typ som anges av type-literal. Om type-literal är annat än void är resultatets typ den namngivna typen och värdet är värdet efter konverteringen. Om type-literal är void skrivs inget objekt till pipelinen och det finns inget resultat.
När ett uttryck av någon typ typ, är den resulterande typen och värdet det enära-uttryckets typ och värde.
Den här operatorn är rätt associativ.
Exempel:
[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 Binär kommateckenoperator
Syntax:
array-literal-expression:
unary-expression
unary-expression , new-lines~opt~ array-literal-expression
Beskrivning:
Den binära kommateckenoperatorn skapar en 1-dimensionell matris vars element är de värden som anges av operanderna, i lexikal ordning. Matrisen har en ej tränad typ.
Exempel:
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
Tillägget av grupperingsparenteser till vissa binära kommateckenuttryck dokumenterar inte standardvärdet. I stället ändras resultatet.
7.4 Intervalloperator
Syntax:
range-expression:
array-literal-expression
range-expression *..* new-lines~opt~
array-literal-expression
Beskrivning:
Ett intervalluttryck skapar en icke-tränad 1-dimensionell matris vars element är värdena för den int-sekvens som anges av intervallbunden. De värden som operanderna anger konverteras till int, om det behövs (6.4). Operanden som anger det lägre värdet efter konverteringen är den nedre gränsen, medan operanden som anger det högre värdet efter konverteringen är den övre gränsen. Båda gränserna kan vara samma, vilket innebär att den resulterande matrisen har längden 1. Om den vänstra operanden anger den nedre gränsen är sekvensen i stigande ordning. Om den vänstra operanden anger den övre gränsen är sekvensen i fallande ordning.
Konceptuellt är den här operatorn en genväg för motsvarande binärt kommateckenoperatorsekvens. Intervallet kan till exempel 5..8
också genereras med hjälp av 5,6,7,8
. Men om en stigande eller fallande sekvens behövs utan att ha en matris kan en implementering undvika att generera en faktisk matris. I behöver till foreach ($i in 1..5) { ... }
exempel ingen matris skapas.
Ett intervalluttryck kan användas för att ange ett matrissegment (9,9).
Exempel:
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-formatoperator
Syntax:
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)
Beskrivning:
Ett formatuttryck formaterar ett eller flera värden som anges av range-expression enligt en formatsträng för specifikation som anges av format-expression. Positionerna för de värden som anges av range-expression numreras med början vid noll och ökar i lexikal ordning. Resultatet har typen string
.
En formatsträng kan innehålla noll eller flera formatspecifikationer som vart och ett har följande format:
{N [ ,M ][ : FormatString ]}
N representerar en (obligatorisk) värdeposition för intervalluttryck , M representerar den (valfria) minsta visningsbredden och FormatString anger formatet (valfritt). Om bredden för ett formaterat värde överskrider den angivna bredden ökas bredden i enlighet med detta. Värden vars positioner inte refereras till i FormatString ignoreras efter att ha utvärderats för eventuella sidoeffekter. Om N refererar till en obefintlig position är beteendet implementeringsdefinierat. Värdet av typen $null
och void formateras som tomma strängar. Matriser formateras som underuttryck (7.1.6). Om du vill inkludera tecknen "{" och "}" i en formatspecifikation utan att de tolkas som formatavgränsare skriver du dem som "{{" respektive "}}".
En fullständig definition av formatspecifikationer finns i typen System.IFormattable
i Ecma Technical Report TR/84.
Exempel:
`$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<
Om N refererar till en obefintlig position i en formatspecifikation utlöses ett FormatError .
7.6 Multiplikativa operatorer
Syntax:
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 Multiplikation
Beskrivning:
Resultatet av multiplikationsoperatorn *
är produkten av de värden som anges av de två operanderna efter att de vanliga aritmetiska konverteringarna (â 6,15) har tillämpats.
Operatorn lämnas associativ.
Exempel:
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 Strängreplikering
Beskrivning:
När den vänstra operanden anger en sträng skapar den binära operatorn en ny sträng som innehåller den som angetts *
av den vänstra operanden och replikerar antalet gånger som anges av värdet för den högra operanden som konverterad till heltalstyp (6.4).
Operatorn lämnas associativ.
Exempel:
"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 Matrisreplikering
Beskrivning:
När den vänstra operanden *
anger en matris skapar den binära operatorn en ny ej tränad 1-dimensionell matris som innehåller det värde som anges av den vänstra operanden och replikerar antalet gånger som anges av värdet för den högra operanden som konverterat till heltalstyp (6.4). Replikeringsantalet noll resulterar i en matris med längden 1. Om den vänstra operanden anger en flerdimensionell matris, plattas den ut (·9.12) innan den används.
Operatorn lämnas associativ.
Exempel:
$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 Division
Beskrivning:
Resultatet av divisionsoperatorn /
är kvoten när värdet som anges av den vänstra operanden divideras med värdet som anges av den högra operanden efter att de vanliga aritmetiska konverteringarna (·6.15) har tillämpats.
Om ett försök görs att utföra heltal eller decimaldivision med noll utlöses ett implementeringsdefinierat avslutande fel.
Operatorn lämnas associativ.
Exempel:
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
Om ett försök görs att utföra heltal eller decimaldivision med noll utlöses ett RuntimeException-undantag .
7.6.5 Rest
Beskrivning:
Resultatet av %
restoperatorn är resten när värdet som anges av den vänstra operanden divideras med värdet som anges av den högra operanden efter att de vanliga aritmetiska konverteringarna (6,15) har tillämpats.
Om ett försök görs att utföra heltal eller decimaldivision med noll utlöses ett implementeringsdefinierat avslutande fel.
Exempel:
10 % 3 # int result 1
10.0 % 0.3 # double result 0.1
10.00D % "0x4" # decimal result 2.00
Om ett försök görs att utföra heltal eller decimaldivision med noll utlöses ett RuntimeException-undantag .
7.7 Additiva operatorer
Syntax:
additive-expression:
multiplicative-expression
additive-expression + new-lines~opt~ multiplicative-expression
additive-expression dash new-lines~opt~ multiplicative-expression
7.7.1 Tillägg
Beskrivning:
Resultatet av additionsoperatorn +
är summan av de värden som anges av de två operanderna efter att de vanliga aritmetiska konverteringarna (6,15) har tillämpats.
Operatorn lämnas associativ.
Exempel:
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 Sträng concatentaion
Beskrivning:
När den vänstra operanden +
anger en sträng skapar den binära operatorn en ny sträng som innehåller det värde som anges av den vänstra operanden följt av de värden som anges av den högra operanden som konverteras till type string (·6.8).
Operatorn lämnas associativ.
Exempel:
"red" + "blue" # "redblue"
"red" + "123" # "red123"
"red" + 123 # "red123"
"red" + 123.456e+5 # "red12345600"
"red" + (20,30,40) # "red20 30 40"
7.7.3 Sammanfogning av matris
Beskrivning:
När den vänstra operanden +
anger en matris skapar den binära operatorn en ny, ej tränad 1-dimensionell matris som innehåller elementen som anges av den vänstra operanden följt av de värden som anges av den högra operanden. Flerdimensionella matriser som finns i någon av operanderna plattas ut (·9.12) innan de används.
Operatorn lämnas associativ.
Exempel:
$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 Hashtable concatenation
Beskrivning:
När båda operanderna anger Hashtables +
skapar den binära operatorn en ny hash-tabell som innehåller elementen som anges av den vänstra operanden följt av de element som anges av den högra operanden.
Om hashtabellerna innehåller samma nyckel utlöses ett implementeringsdefinierat avslutande fel.
Operatorn lämnas associativ.
Exempel:
$h1 = @{ FirstName = "James"; LastName = "Anderson" }
$h2 = @{ Dept = "Personnel" }
$h3 = $h1 + $h2 # new Hashtable, Count = 3
Om hashtabellerna innehåller samma nyckel utlöses ett undantag av typen BadOperatorArgument .
7.7.5 Subtraktion
Beskrivning:
Subtraktionsoperatorns -
resultat är skillnaden när värdet som anges av den högra operanden subtraheras från det värde som anges av den vänstra operanden efter att de vanliga aritmetiska konverteringarna (·6.15) har tillämpats.
Operatorn lämnas associativ.
Exempel:
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 Jämförelseoperatorer
Syntax:
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)
Beskrivning:
Typen av värde som anges av den vänstra operanden avgör hur värdet som anges av den högra operanden konverteras (â 6), om det behövs, innan jämförelsen görs.
Vissa jämförelseoperatorer (skrivna här som -op) har två varianter, en som är fallkänslig (-cop) och en som inte är (-iop). -op-versionen motsvarar -iop. Fallkänsligheten är bara meningsfull med jämförelser av värden av typen sträng. I jämförelsekontexter som inte är strängar fungerar de två varianterna på samma sätt.
Dessa operatorer lämnas associativa.
7.8.1 Likhets- och relationsoperatorer
Beskrivning:
Det finns två likhetsoperatorer: likhet (-eq
) och olikhet (-ne
), och fyra relationsoperatorer: mindre än (-lt
), mindre än eller lika med (-le
), större än (-gt
) och större än eller lika med (-ge
). Var och en av dessa har två varianter (–7,8).
För att två strängar ska kunna jämföras med måste de ha samma längd och innehåll, och bokstavsfall om det behövs.
Om värdet som anges av den vänstra operanden inte är en samling har resultatet typen bool
.
Annars är resultatet en eventuellt tom 1-dimensionell matris som innehåller elementen i samlingen som testar True jämfört med värdet som anges av den högra operanden.
Exempel:
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 Inneslutningsoperatorer
Beskrivning:
Det finns fyra inneslutningsoperatorer: contains (-contains
), does-not-contain (‑notcontains
), in (-in
) och not-in ().-notin
Var och en av dessa har två varianter (–7,8).
Inneslutningsoperatorer returnerar ett resultat av typen bool som anger om ett värde inträffar (eller inte inträffar) minst en gång i elementen i en matris. Med -contains
och ‑notcontains
anges värdet av den högra operanden och matrisen anges av den vänstra operanden. Med -in -notin
och är operanderna omvända. Värdet anges av den vänstra operanden och matrisen anges av den högra operanden.
För dessa operatorer behandlas skalära värden som en matris med ett element om matrisopernden har ett skalära värde.
Exempel:
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 Typtestnings- och konverteringsoperatorer
Beskrivning:
Typoperatorn -is
testar om värdet som anges av den vänstra operanden har typen eller härleds från en typ som har typen , som anges av den högra operanden. Den högra operanden måste ange en typ eller ett värde som kan konverteras till en typ (till exempel en sträng som namnger en typ).
Resultatets typ är bool
. Typoperatorn -isnot
returnerar den logiska negationen för motsvarande -is
formulär.
Typoperatorn -as
försöker konvertera värdet som anges av den vänstra operanden till den typ som anges av den högra operanden. Den högra operanden måste ange en typ eller ett värde som kan konverteras till en typ (till exempel en sträng som namnger en typ). Om konverteringen misslyckas returneras $null
. Annars returneras det konverterade värdet och returtypen för resultatet är körningstypen för det konverterade värdet.
Exempel:
$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 Operatorer för mönstermatchning och textmanipulering
7.8.4.1 Operatorerna -like och -notlike
Beskrivning:
Om den vänstra operanden inte anger någon samling har resultatet typen bool
. Annars är resultatet en eventuellt tom 1-dimensionell matris som innehåller elementen i samlingen som testar True jämfört med värdet som anges av den högra operanden. Den högra operanden kan ange en sträng som innehåller uttryck med jokertecken (3.15). Dessa operatorer har två varianter (7,8).
Exempel:
"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 Operatorerna -match och -notmatch
Beskrivning:
Om den vänstra operanden bool
$true
inte anger någon samling har resultatet typen och om resultatet är , anges elementen i hash-tabellen $matches
till de strängar som matchar (eller matchar inte) värdet som anges av den högra operanden. Annars är resultatet en eventuellt tom, 1-dimensionell matris som innehåller elementen i samlingen som testar True jämfört med värdet som anges av den högra operanden och $matches
som inte har angetts. Den högra operanden kan ange en sträng som innehåller reguljära uttryck (3.16), i vilket fall det kallas ett mönster. Dessa operatorer har två varianter (7,8).
Dessa operatorer stöder delmatchningar (7.8.4.6).
Exempel:
"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 Operatorn -replace
Beskrivning:
Operatorn -replace
tillåter textersättning i en eller flera strängar som anges av den vänstra operanden med hjälp av de värden som anges av den högra operanden. Den här operatorn har två varianter (7,8). Den högra operanden har något av följande former:
- Strängen som ska finnas, som kan innehålla reguljära uttryck (3.16). I det här fallet är ersättningssträngen implicit "".
- En matris med 2 objekt som innehåller strängen som ska finnas, följt av ersättningssträngen.
Om den vänstra operanden anger en sträng har resultatet en typsträng. Om den vänstra operanden anger en 1-dimensionell matris med sträng är resultatet en icke-tränad 1-dimensionell matris vars längd är samma som för den vänstra operandens matris, som innehåller indatasträngarna efter att ersättningen har slutförts.
Den här operatorn stöder delmatchningar (7.8.4.6).
Exempel:
"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 Operatorn binary -join
Beskrivning:
Den binära -join
operatorn genererar en sträng som är sammanfogningen av värdet för ett eller flera objekt som angetts av den vänstra operanden efter att ha konverterats till sträng (6,7), om det behövs. Strängen som anges av den högra operanden används för att separera (eventuellt tomma) värden i den resulterande strängen.
Den vänstra operanden kan vara ett skalära värde eller en samling.
Exempel:
(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 Operatorn binary -split
Beskrivning:
Den binära -split
operatorn delar upp en eller flera strängar som anges av den vänstra operanden och returnerar sina underdelar i en begränsad 1-dimensionell strängmatris. Den här operatorn har två varianter (7,8). Den vänstra operanden kan ange ett skalära värde eller en matris med strängar. Den högra operanden har något av följande former:
- En avgränsarsträng
- En matris med 2 objekt som innehåller en avgränsarsträng följt av ett numeriskt antal delningar
- En matris med 3 objekt som innehåller en avgränsarsträng, ett numeriskt antal delningar och en alternativsträng
- Ett skriptblock
- En matris med 2 objekt som innehåller ett skriptblock följt av ett numeriskt antal delningar
Avgränsarsträngen kan innehålla reguljära uttryck (3.16). Den används för att hitta underdelar med indatasträngarna. Avgränsaren ingår inte i de resulterande strängarna. Om den vänstra operanden anger en tom sträng resulterar det i ett tomt strängelement. Om avgränsarsträngen är en tom sträng finns den vid varje teckenposition i indatasträngarna.
Som standard placeras alla underdelar i indatasträngarna i resultatet som separata element. Antalet delningar kan dock användas för att ändra det här beteendet. Om antalet är negativt, noll eller större än eller lika med antalet underdelar i en indatasträng hamnar varje underdel i ett separat element. Om antalet är mindre än antalet underdelar i indatasträngen finns det count-element i resultatet, där det sista elementet innehåller alla underdelar utöver det första antalet – 1 underdelar.
En alternativsträng innehåller noll eller flera alternativnamn där varje angränsande par avgränsas med ett kommatecken. Inledande, avslutande och inbäddat tomt utrymme ignoreras. Alternativnamn kan vara i valfri ordning och är fallkänsliga.
Om en alternativsträng innehåller alternativnamnet SimpleMatch kan den också innehålla alternativnamnet IgnoreCase. Om en alternativsträng innehåller alternativnamnet RegexMatch eller om den inte innehåller RegexMatch eller SimpleMatch, kan den innehålla val annat alternativnamn än SimpleMatch. Den får dock inte innehålla både Multiline och Singleline.
Här är uppsättningen alternativnamn:
Alternativ | Beskrivning |
---|---|
CultureInvariant | Ignorerar kulturella skillnader i språk vid utvärdering av avgränsaren. |
ExplicitCapture | Ignorerar icke-namngivna matchningsgrupper så att endast explicita insamlingsgrupper returneras i resultatlistan. |
IgnoreCase | Framtring av icke-känslig matchning, även om -csplit används. |
IgnorePatternWhitespace | Ignorerar tomt utrymme som inte är över och kommentarer som markerats med nummertecknet (#). |
Multiline | Det här läget identifierar början och slutet av rader och strängar. Standardläget är Enkelrad. |
RegexMatch | Använd matchning av reguljära uttryck för att utvärdera avgränsaren. Det här är standardinställningen. |
SimpleMatch | Använd enkel strängjämförelse när du utvärderar avgränsaren. |
Enkelrad | Det här läget identifierar endast början och slutet av strängar. Det är standardläget. |
Skriptblocket (·7.1.8) anger reglerna för att fastställa avgränsaren och måste utvärderas till typen bool.
Exempel:
"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 Delmatchningar
Mönstret som matchas av -match
, -notmatch
och -replace
kan innehålla underdelar (kallas undermatchningar) avgränsade med parenteser. Se följande exempel:
"red" -match "red"
Resultatet är och $true
nyckel 0 $matches
i innehåller "röd", den del av strängen som anges av den vänstra operanden som exakt matchade mönstret som angetts av den högra operanden.
I följande exempel är hela mönstret ett undermatchning:
"red" -match "(red)"
Precis som tidigare innehåller nyckel 0 "röd"; Nyckel 1 innehåller dock även "röd", vilket är den del av strängen som anges av den vänstra operanden som exakt matchade undermatchning.
Tänk på följande, mer komplexa mönster:
"red" -match "((r)e)(d)"
Det här mönstret tillåter delmatchningar av "r", "re", "d" eller "red".
Nyckel 0 innehåller återigen "röd". Nyckel 1 innehåller "re", nyckel 2 innehåller "r" och nyckel 3 innehåller "d". Nyckel/värde-paren är i matchande ordning från vänster till höger i mönstret, med längre strängmatchningar före kortare.
När det gäller -replace
kan ersättningstexten komma åt undermatchningar via $n
namnen på formuläret , där den första $1
matchningen är , den andra är $3
och så vidare. Exempel:
"Monday morning" -replace '(Monday|Tuesday) (morning|afternoon|evening)','the $2 of $1'
Den resulterande strängen är "måndagens morgon".
I stället för att ha nycklar $matches
i nollbaserade index kan undermatchningar namnges med hjälp av formuläret ?<*name*>
. Kan till exempel "((r)e)(d)"
skrivas med tre namngivna undermatchningar, m1, m2 och m3, enligt följande: "(?<m1>(?<m2>r)e)(?<m3>d)"
.
7.8.5 Skiftoperatorer
Beskrivning:
Skift-vänsteroperatorn (-shl
) och skift högeroperatorn (-shr
) konverterar värdet som utformats av den vänstra operanden till en heltalstyp och värdet som anges av den högra operanden till int, vid behov, med hjälp av de vanliga aritmetiska konverteringarna (·6.15).
Skift-vänsteroperatorn flyttar den vänstra operanden åt vänster med ett antal bitar som beräknas enligt beskrivningen nedan. De tomma bitpositionerna med låg ordning är inställda på noll.
Operatorn skift höger flyttar den vänstra operanden till höger med ett antal bitar som beräknas enligt beskrivningen nedan. Den vänstra operandens lågordnings bitar tas bort, och de återstående bitarna flyttas åt höger. När den vänstra operanden är ett signerat värde anges de tomma bitpositionerna med hög ordning till noll om den vänstra operanden är icke-negativ och inställd på ett om den vänstra operanden är negativ. När den vänstra operanden är ett osignerat värde anges de tomma bitpositionerna med hög ordning till noll.
När den vänstra operanden har typen int anges skiftantalet av de fem bitarna med låg ordning i den högra operanden. När den högra operanden har typen long anges skiftantalet av den låga ordningen sex bitar av den högra operanden.
Exempel:
0x0408 -shl 1 # int with value 0x0810
0x0408 -shr 3 # int with value 0x0081
0x100000000 -shr 0xfff81 # long with value 0x80000000
7.9 Bitvisa operatorer
Syntax:
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
Beskrivning:
Den bitvisa AND-operatorn -band
, den bitvisa OR-operatorn -bor
och den bitvisa XOR-operatorn -bxor konverterar de värden som operanderna anger till heltalstyper, om det behövs, med hjälp av de vanliga aritmetiska konverteringarna (6,15). Om båda värdena har typen int efter konverteringen är det resultatets typ. Om båda värdena har typen long är det annars typen av resultat. Om ett värde har typen int och det andra har typen long är resultatet lång. Annars är uttrycket dåligt format. Resultatet är den bitvisa AND-, bitvisa ELLER- eller bitvisa XOR-delen av de eventuellt konverterade operandvärdena.
Dessa operatorer lämnas associativa. De är kommutativa om ingen operand innehåller en sidoeffekt.
Exempel:
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 Logiska operatorer
Syntax:
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
Beskrivning:
Den logiska operatorn AND -and
konverterar de värden som anges av operanderna bool
till , om det behövs (6.2). Resultatet är det logiska AND för de eventuellt konverterade operandvärdena och har typen bool
. Om den vänstra operanden utvärderas till Falskt utvärderas inte den högra operanden.
Den logiska OR-operatorn -or
konverterar de värden som anges av operanderna bool
till , om det behövs (6.2). Resultatet är det logiska ELLER för de eventuellt konverterade operandvärdena och har typen bool
. Om den vänstra operanden utvärderas till Sant utvärderas inte den högra operanden.
Den logiska XOR-operatorn -xor
konverterar de värden som anges av operanderna till bool
(6.2). Resultatet är den logiska XOR för de eventuellt konverterade operandvärdena och har typen bool
.
Dessa operatorer lämnas associativa.
Exempel:
$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 Tilldelningsoperatorer
Syntax:
assignment-expression:
expression assignment-operator statement
assignment-operator: *one of
= dash = += *= /= %=
Beskrivning:
En tilldelningsoperator lagrar ett värde på den skrivbara plats som anges av uttrycket . En diskussion om assignment-operator finns =
i .7.11.1. En diskussion av alla andra tilldelningsoperatorer finns i .7.11.2.
Ett tilldelningsuttryck har värdet som anges av uttrycket när tilldelningen har ägt rum. Tilldelningsuttrycket anger dock inte själv en skrivbar plats. Om uttrycket är typbegränsat (–5,3) är den typ som används i begränsningen typen av resultat. Annars är typen av resultat typen efter att de vanliga aritmetiska konverteringarna (6,15) har tillämpats.
Den här operatorn är rätt associativ.
7.11.1 Enkel tilldelning
Beskrivning:
I enkel tilldelning (=
) ersätter värdet som anges av - instruktionen det värde som lagras på den skrivbara plats som anges av uttrycket. Men om uttrycket anger en nyckel som inte finns i en hash-tabell läggs nyckeln till i hash-tabellen med ett associerat värde för värdet som anges av - instruktionen.
Enligt grammatiken kan uttryck ange en kommaavgränsad lista över skrivbara platser.
Detta kallas för flera tilldelningar. - instruktionen anger en lista med ett eller flera kommaavgränsade värden. Kommatecken i endera operandlistan är en del av syntaxen för flera tilldelningar och representerar inte den binära kommateckenoperatorn. Värden tas från listan som anges av -instruktionen , i lexikal ordning, och lagras på motsvarande skrivbara plats som anges av uttrycket. Om listan som anges av -instruktionen har färre värden än det finns skrivbara platser för uttryck tar de överflödiga platserna värdet $null
. Om listan som anges av -instruktionen har fler värden än det finns skrivbara platser för uttryck, tar alla utom den plats för uttrycket som är mest till höger på motsvarande instruktionsvärde, och platsen för uttrycket right-most blir en ej tränad 1-dimensionell matris med alla återstående instruktionsvärden som element.
För -instruktioner som har värden (8.1.2) kan -instruktionen vara en -instruktion.
Exempel:
$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 Sammansatt tilldelning
Beskrivning:
En sammansatt tilldelning har formen E1 op= E2
och E1 = E1 op (E2)
motsvarar det enkla tilldelningsuttrycket, förutom att uttrycket E1 i det sammansatta tilldelningsfallet endast utvärderas en gång. Om uttrycket är typbegränsat (–5,3) är den typ som används i begränsningen typen av resultat. Annars bestäms resultatets typ av op. For *=
, see §7.6.1, §7.6.2, §7.6.3; for /=
, see §7.6.4; for %=
, see §7.6.5; for +=
, see §7.7.1, §7.7.2, §7.7.3; for -=
, see §7.7.5.
Anteckning
En operand som anger ett ej tränat värde av numerisk typ kan få sin typ ändrad av en tilldelningsoperator när resultatet lagras.
Exempel:
$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 Operatorer för omdirigering
Syntax:
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
Beskrivning:
Omdirigeringsoperatorn >
tar standardutdata från pipelinen och omdirigerar den till den plats som anges av redirected-file-name och skriver över platsens aktuella innehåll.
Omdirigeringsoperatorn >>
tar standardutdata från pipelinen och omdirigerar den till den plats som anges av redirected-file-name, och i så fall till den platsens aktuella innehåll. Om den platsen inte finns skapas den.
Omdirigeringsoperatorn n>
med formuläret tar utdata från dataströmmen n från pipelinen och omdirigerar den till den plats som anges av redirected-file-name och skriver över platsens aktuella innehåll.
Omdirigeringsoperatorn n>>
med formuläret tar utdata från dataströmmen n från pipelinen och omdirigerar den till den plats som anges av redirected-file-name, och i så fall till den platsens aktuella innehåll. Om den platsen inte finns skapas den.
Omdirigeringsoperatorn med formuläret skriver m>&n
utdata från stream m till samma plats som stream n.
Följande är giltiga strömmar:
Stream | Beskrivning |
---|---|
1 | Standardutdataström |
2 | Felutdataström |
3 | Varningsutdataström |
4 | Utförlig utdataström |
5 | Felsöka utdataström |
* | Standardutdata, felutdata, varningsutdata, utförliga utdata och felsökning av utdataströmmar |
Omdirigeringsoperatorer 1>&2
, 6>
och 6>>
är <
reserverade för framtida användning.
Om värdet för redirected-file-name är på $null
matas ut ignoreras utdata.
Normalt skrivs värdet för ett uttryck som innehåller en sidoeffekt på den översta nivån inte till pipelinen såvida inte uttrycket omges av ett par parenteser. Men om ett sådant uttryck är den vänstra operanden för en operator som omdirigerar standardutdata skrivs värdet.
Exempel:
$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
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för