Странная разница между $ _ и [параметром (ValueFromPipeline = $ true)]
Я подошел к краю своего PoweShell-фу. Может кто-нибудь объяснить мне, почему эти две функции действуют по-разному при передаче в массив массивов? Все, что отличается, я использую$_
или же[parameter(ValueFromPipeline=$true)] $input
чтобы получить на входе трубопровода. Я ожидал, что они будут действовать одинаково в этой ситуации.
$pairs = ('a', 'b'), ('c', 'd')
function dollarUnderscoreFunction
{
Process
{
Write-Host "`$_[0] = $($_[0])"
Write-Host "`$_[1] = $($_[1])"
}
}
function pipedParameterFunction([parameter(ValueFromPipeline=$true)] $input)
{
Process
{
Write-Host "`$input[0] = $($input[0])"
Write-Host "`$input[1] = $($input[1])"
}
}
Write-Host "`$pairs:"
$pairs | foreach { Write-Host $_ }
Write-Host "`nRunning dollarUnderscoreFunction`n"
$pairs | dollarUnderscoreFunction
Write-Host "`nRunning pipedParameterFunction`n"
$pairs | pipedParameterFunction
Вывод в PowerShell v3:
$pairs:
a b
c d
Running dollarUnderscoreFunction
$_[0] = a
$_[1] = b
$_[0] = c
$_[1] = d
Running pipedParameterFunction
$input[0] = a b
$input[1] =
$input[0] = c d
$input[1] =
Вывод в PowerShell v2:
$pairs:
a b
c d
Running dollarUnderscoreFunction
$_[0] = a
$_[1] = b
$_[0] = c
$_[1] = d
Running pipedParameterFunction
[ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
At C:\Untitled1.ps1:16 char:8
+ $input[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
$input[0] =
[ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
At C:\Untitled1.ps1:17 char:8
+ $input[ <<<< 1]
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
$input[1] =
[ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
At C:\Untitled1.ps1:16 char:8
+ $input[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
$input[0] =
[ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
At C:\Untitled1.ps1:17 char:8
+ $input[ <<<< 1]
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
$input[1] =