我經常寫的是需要接受管道喜歡的功能:PowerShell管道迭代
function Invoke-ExchangeHubChecks
{
[cmdletbinding()]
param
(
[Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[object[]]$oServersToTest,
[int]$QueueWarnThreshold = 50,
[int]$QueueFailThreshold = 100
)
begin
{
$oHubTests = @()
$c=0
}
Process
{
$c++
$Server = $oServersToTest[0]
$oHubTests += [pscustomobject]@{
Identity = $server.Identity
Queue = "blah"
Count = $c
}
}
end
{
$oHubTests
}
}
end
{
$oHubTests
}
}
我經常看到的代碼片段與工藝塊內一個foreach。我的理解是,進程塊取代了對foreach塊的需求(在大多數情況下)。
我需要爲輸入對象「$ oServersToTest」添加一個「過濾器」。我用「凡客體」創建過濾器:
$Server = $oServersToTest[0] | Where-Object {$_.IsHub}
然而,由於它遍歷集合,它補充說,不要在where子句自定義對象匹配的對象,由$ C證明:
輸出:
Identity Queue Count
-------- ----- -----
Server01 blah 1
Server02 blah 2
Server03 blah 3
Server04 blah 4
Server05 blah 5
blah 6
blah 7
Server06 blah 8
Server07 blah 9
Server08 blah 10
Server09 blah 11
Server10 blah 12
blah 13
blah 14
這是一個例子,其中我必須使用處理塊內一個foreach:
Process
{
$c++
#$Server = $oServersToTest[0] | Where-Object{$_.IsHubServer}
$TestResult = @()
$oServersToTest | Where-Object {$_.IsHubServer} | Foreach-object{
$TestResult += [pscustomobject]@{
Identity = $_.Identity
Queue = "blah"
Count = $c
}
}
$oHubTests += $TestResult
}
End
{
$oHubTests
}
哪個有效,但爲什麼這個工作,而不是其他方式?對我來說,這是工作的兩倍。
(Powershell的5.0)
TIA
在大多數情況下,PROCESS過程中的'ForEach'允許過濾器/函數既可以作爲cmdlet('Do-MyStuff-計算機名稱A,B,C')使用,也可以作爲過濾器使用管道('Retrieve-Computers | Do-MyStuff')。這是有效的,因爲如果'$ ComputerName'被聲明爲'[String []]'並且只傳遞一個計算機名稱,它將被強制轉換爲只有一個元素的數組。 –