about_PSItem
Rövid leírás
Az automatikus változó, amely az aktuális objektumot tartalmazza a folyamatobjektumban.
Hosszú leírás
A PowerShell automatikus változóként tartalmazza a $PSItem
változót és annak aliasát $_
az aktuális objektumot feldolgozó szkriptblokkokban, például a folyamatban. Ez a cikk a példákban szerepel $PSItem
, de $PSItem
minden példában lecserélhető $_
.
Ezt a változót olyan parancsokban használhatja, amelyek műveletet hajtanak végre egy folyamat minden objektumán.
A következő esetekben van néhány gyakori használati eset $PSItem
:
- parancsmag folyamatparaméterének szkriptblokkjában
ForEach-Object
- parancsmag FilterScript paraméterének szkriptblokkjában
Where-Object
- intrinsic methods ForEach és Where
- delay-bind scriptblock paraméterekkel
- az
switch
utasítás feltételes értékeiben és a hozzájuk tartozó szkriptblokkokban - függvény
process
blokkjában - definícióban
filter
- a ValidateScript attribútum szkriptblokkjában
A cikk további része példákat tartalmaz az ilyen használati esetek használatára $PSItem
.
ForEach-Object folyamat
A ForEach-Object parancsmag úgy lett kialakítva, hogy a folyamat összes objektumához végrehajtsa a Folyamat paraméter szkriptblokkját.
A Folyamat paraméter szkriptblokkjában használható$PSItem
, de a Begin vagy a End paraméter szkriptblokkjaiban nem. Ha a Begin vagy End paraméter szkriptblokkjaira hivatkozik$PSItem
, az érték az, $null
hogy ezek a szkriptblokkok nem működnek a folyamat egyes objektumaiban.
$parameters = @{
Begin = { Write-Host "PSItem in Begin is: $PSItem" }
Process = {
Write-Host "PSItem in Process is: $PSItem"
$PSItem + 1
}
End = { Write-Host "PSItem in End is: $PSItem" }
}
$result = 1, 2, 3 | ForEach-Object @parameters
Write-Host "Result is: $result"
PSItem in Begin is:
PSItem in Process is: 1
PSItem in Process is: 2
PSItem in Process is: 3
PSItem in End is:
Result is: 2 3 4
Where-Object FilterScript
A Where-Object parancsmag célja a folyamat objektumainak szűrése.
Használhatja $PSItem
a FilterScript paraméter szkriptblokkjában, amely a folyamat minden bemeneti objektumához egyszer hajt végre.
1, 2, 3 | Where-Object -FilterScript { ($PSItem % 2) -eq 0 }
2
Ebben a példában a FilterScript ellenőrzi, hogy az aktuális objektum páros-e, kiszűri a páratlan értékeket, és csak 2
az eredeti listából ad vissza.
ForEach és Where metódusok
A tömbök ForEach és Where belső metódusai egyaránt szkriptblokkot használnak bemeneti paraméterként. A $PSItem
szkriptblokkok használatával elérheti az aktuális objektumot.
@('a', 'b', 'c').ForEach({ $PSItem.ToUpper() }).Where({ $PSItem -ceq 'B' })
B
Ebben a példában a ForEach metódus szkriptblokkja nagybetűssé emeli az aktuális objektumot. Ezután a Where metódus szkriptblokkja csak B
a függvényt adja vissza.
Delay-bind scriptblock paraméterek
A késleltetési kötés szkriptblokkjai lehetővé teszik $PSItem
a folyamatalapú parancsmag paramétereinek definiálását a végrehajtás előtt.
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }
Utasításszkriptblokkok váltása
A kapcsolóutasításokban műveletszkriptblokkokban és utasításállapot-szkriptblokkokban is használható $PSItem
.
$numbers = 1, 2, 3
switch ($numbers) {
{ ($PSItem % 2) -eq 0 } { "$PSItem is even" }
default { "$PSItem is odd" }
}
1 is odd
2 is even
3 is odd
Ebben a példában az utasításfeltétel szkriptblokkja ellenőrzi, hogy az aktuális objektum páros-e. Ha ez páros, a társított műveleti szkriptblokk egy üzenetet ad ki, amely azt jelzi, hogy az aktuális objektum egyenlő.
A feltétel műveletszkriptblokkja default
egy üzenetet ad ki, amely jelzi, hogy az aktuális objektum páratlan.
Függvényfolyamat-blokkok
Ha definiál egy függvényt, használhatja $PSItem
a process
blokkdefiníciót, de nem a end
begin
blokkdefiníciókban. Ha a end
begin
blokkokra hivatkozik$PSItem
, az érték az, $null
hogy ezek a blokkok nem működnek a folyamat egyes objektumaiban.
Ha a blokkdefinícióban használja$PSItem
, az érték az aktuális objektum, ha a függvényt meghívják a folyamatban, és egyébként$null
.process
function Add-One {
process { $PSItem + 1 }
}
1, 2, 3 | Add-One
2
3
4
Tipp.
Bár speciális függvényekben is használható$PSItem
, erre kevés oka van. Ha bemenetet szeretne kapni a folyamatból, a legjobb, ha paramétereket határoz meg a ValueFromPipeline*
Paraméter attribútum egyik argumentumával.
A paraméterattribútum és a parancsmag-kötés speciális függvényekhez való használata explicitebbé és kiszámíthatóbbá teszi a megvalósítást, mint az aktuális objektum feldolgozása a szükséges értékek lekéréséhez.
A speciális függvények egyik jó funkciója $PSItem
, ha az aktuális objektumot vizsgálja meg hibakeresés vagy naplózás céljából, ha a függvény több paramétert is használ, amelyek bemenetet vesznek fel a folyamatból.
function Write-JsonLog {
[CmdletBinding()]
param(
[parameter(ValueFromPipelineByPropertyName)]
[string]$Message
)
begin {
$entries = @()
}
process {
$entries += [pscustomobject]@{
Message = $Message
TimeStamp = [datetime]::Now
}
if ($PSItem) {
$props = $PSItem | ConvertTo-Json
$number = $entries.Length
Write-Verbose "Input object $number is:`n$props"
}
}
end {
ConvertTo-Json -InputObject $entries
}
}
Ez a példafüggvény JSON-objektumokból álló tömböt ad ki üzenettel és időbélyeggel. Amikor egy folyamat meghívja, minden egyes bejegyzéshez az aktuális objektum Üzenet tulajdonságát használja. Az aktuális objektum JSON-ábrázolását is a részletes adatfolyamba írja, így a kimeneti naplókhoz képest láthatja a tényleges bemenetet.
$Items = @(
[pscustomobject]@{
Name = 'First Item'
Message = 'A simple note'
}
[pscustomobject]@{
Name = 'Item with extra properties'
Message = 'Missing message, has info instead'
Info = 'Some metadata'
Source = 'Where this came from'
}
[pscustomobject]@{
Name = 'Last Item'
Message = 'This also gets logged'
}
)
$Items | Write-JsonLog -Verbose
VERBOSE: Input object 1 is:
{
"Name": "First Item",
"Message": "A simple note"
}
VERBOSE: Input object 2 is:
{
"Name": "Item with extra properties",
"Message": "Missing message, has info instead",
"Info": "Some metadata",
"Source": "Where this came from"
}
VERBOSE: Input object 3 is:
{
"Name": "Last Item",
"Message": "This also gets logged"
}
[
{
"Message": "A simple note",
"TimeStamp": "\/Date(1670344068257)\/"
},
{
"Message": "Missing message, has info instead",
"TimeStamp": "\/Date(1670344068259)\/"
},
{
"Message": "This also gets logged",
"TimeStamp": "\/Date(1670344068261)\/"
}
]
Definíciók szűrése
A szűrő definíciójának utasításlistájában használható$PSItem
.
Definíció $PSItem
használata filter
esetén az érték az aktuális objektum, ha a szűrőt a folyamat meghívja, és ellenkező esetben.$null
filter Test-IsEven { ($PSItem % 2) -eq 0 }
1, 2, 3 | Test-IsEven
False
True
False
Ebben a példában a Test-IsEven
szűrő akkor jelenik $true
meg, ha az aktuális objektum páros szám, és $false
ha nem.
A ValidateScript attribútum szkriptblokkja
A ValidateScript attribútum szkriptblokkjában is használható$PSItem
.
A ValidateScript$PSItem
használata esetén az érvényesített aktuális objektum értéke. Ha a változó vagy paraméter értéke tömb, a szkriptblokkot a tömb $PSItem
minden egyes objektumához meghívja az aktuális objektumként.
function Add-EvenNumber {
param(
[ValidateScript({ 0 -eq ($PSItem % 2) })]
[int[]]$Number
)
begin {
[int]$total = 0
}
process {
foreach ($n in $Number) {
$total += $n
}
}
end {
$total
}
}
Add-EvenNumber -Number 2, 4, 6
Add-EvenNumber -Number 1, 2
12
Add-EvenNumber : Cannot validate argument on parameter 'Number'. The
" 0 -eq ($PSItem % 2) " validation script for the argument with value "1"
did not return a result of True. Determine why the validation script
failed, and then try the command again.
At line:1 char:24
+ Add-EvenNumber -Number 1, 2
+ ~~~~
+ CategoryInfo : InvalidData: (:) [Add-EvenNumber],
ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,
Add-EvenNumber
Ebben a példában a ValidateScript attribútum szkriptblokkja egyszer fut a Szám paraméternek átadott összes értéknél, és hibát ad vissza, ha egy érték nem is egyenletes.
A Add-EvenNumber
függvény hozzáadja az érvényes bemeneti számokat, és visszaadja a végösszeget.