在Microsoft 制作的教程中,有一個類似于以下的代碼片段(編輯了原文以減少分心):
function Test {
param (
[Parameter(ValueFromPipeline)]
[string[]]$Params
)
process {
foreach ($Param in $Params) {
Write-Output $Param
}
}
}
然而,在所有前面的例子中,process
塊本身已經被用作回圈體。據我了解,以下簡化代碼應該是等效的:
function Test {
param (
[Parameter(ValueFromPipeline)]
[string[]]$Params
)
process {
Write-Output $Params
}
}
確實,無論我用什么管它,結果都是一樣的。然而,它出現在第一方教程中的事實讓我相信使用回圈可能有一些實際原因。
使用一種模式與另一種模式有什么區別嗎?如果是,那是什么?如果不是,哪個是首選?
以防我的簡化被關閉,這是原始示例:
function Test-MrErrorHandling {
[CmdletBinding()]
param (
[Parameter(Mandatory,
ValueFromPipeline,
ValueFromPipelineByPropertyName)]
[string[]]$ComputerName
)
PROCESS {
foreach ($Computer in $ComputerName) {
Test-WSMan -ComputerName $Computer
}
}
}
uj5u.com熱心網友回復:
要點
您傳遞給管道中下一個cmdlet的內容(在您的情況下)有很大的不同:Test-WSMan
function Test1 {
param (
[Parameter(ValueFromPipeline)]
[string[]]$Params
)
process {
foreach ($Param in $Params) {
Write-Output ('Param: {0}, ToString: {1}, Count: {2}' -f $Param, "$Param", $Param.Count)
}
}
}
1,2,@(3,4) |Test1
Param: 1, ToString: 1, Count: 1
Param: 2, ToString: 2, Count: 1
Param: 3, ToString: 3, Count: 1
Param: 4, ToString: 4, Count: 1
function Test2 {
param (
[Parameter(ValueFromPipeline)]
[string[]]$Params
)
process {
Write-Output ('Param: {0}, ToString: {1}, Count: {2}' -f $Params, "$Params", $Params.Count)
}
}
1,2,@(3,4) |Test2
Param: System.String[], ToString: 1, Count: 1
Param: System.String[], ToString: 2, Count: 1
Param: System.String[], ToString: 3 4, Count: 2
換句話說,在第二個示例中,您實際上將字串陣列 ( [String[]]
) 傳遞給Test-WSMan
. 由于Test-WSMan
實際上需要單個字串 ( [[-ComputerName] <String>]
),PowerShell 將方便地將字串陣列 ( )型別String[]
轉換為單個字串型別 ( String
)。
請注意,在某些情況下,如果您(意外)@(3,4)
在管道中強制使用陣列 ( ),則可能會出現第二個示例中的錯誤。在這種情況下,陣列中的多個專案將加入并傳遞給下一個 cmdlet。
使用單數引數名稱
通常,(強烈)建議使用單數引數名稱,這通常也意味著您希望String
每個管道專案都有一個(例如$ComputerName
當時的 a):
避免對值為單個元素的引數使用復數名稱。這包括采用陣列或串列的引數,因為用戶可能提供只有一個元素的陣列或串列。
只有在引數的值始終是多元素值的情況下,才應使用復數引數名稱。在這些情況下,cmdlet 應驗證是否提供了多個元素,如果未提供多個元素,則 cmdlet 應向用戶顯示警告。
這對于您的第二個示例意味著:
function Test2 {
param (
[Parameter(ValueFromPipeline)]
[string]$Param
)
process {
Write-Output $Param
}
}
您自己的(而不是呼叫的Test-WSMan
)cmdlet 將在哪里產生錯誤:
1,2,@(3,4) |Test2
Test2: The input object cannot be bound to any parameters for the
command either because the command does not take pipeline input or
the input and its properties do not match any of the parameters
that take pipeline input.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495162.html