Нет, первый пример не просто наследие.Чтобы создать функцию PowerShell, которая использует параметр массива и принимает конвейерный ввод, вам нужно проделать определенную работу.
Я даже пойду, чтобы сказать, что второй пример не работает.По крайней мере, я не смог заставить его работать.
Возьмите этот пример ...
function PipelineMadness()
{
[cmdletbinding()]
param (
[Parameter(Mandatory = $true, ValueFromPipeline=$true)]
[int[]] $InputArray
)
Write-Host ('$InputArray.Count {0}' -f $InputArray.Count)
Write-Host $InputArray
Write-Host ('$input.Count {0}' -f $input.Count)
Write-Host $input
if($input) { Write-Host "input is true" }
else { Write-Host "input is false" }
}
results ...
PS C:\Windows\system32> 1..5 | PipelineMadness
$InputArray.Count 1
5
$input.Count 5
1 2 3 4 5
input is true
PS C:\Windows\system32> PipelineMadness (1..5)
$InputArray.Count 5
1 2 3 4 5
$input.Count 1
input is false
Обратите внимание, что когда конвейер работаетиспользованная переменная $InputArray
представляет собой одно значение 5 ...
Теперь с блоками BEGIN и PROCESS
function PipelineMadnessProcess()
{
[cmdletbinding()]
param (
[Parameter(Mandatory = $true, ValueFromPipeline=$true)]
[int[]] $InputArray
)
BEGIN
{
Write-Host 'BEGIN'
Write-Host ('$InputArray.Count {0}' -f $InputArray.Count)
Write-Host $InputArray
Write-Host ('$input.Count {0}' -f $input.Count)
Write-Host $input
if($input) { Write-Host "input is true" }
else { Write-Host "input is false" }
}
PROCESS
{
Write-Host 'PROCESS'
Write-Host ('$InputArray.Count {0}' -f $InputArray.Count)
Write-Host $InputArray
Write-Host ('$input.Count {0}' -f $input.Count)
Write-Host $input
if($input) { Write-Host "input is true" }
else { Write-Host "input is false" }
}
}
Теперь это странное
PS C:\Windows\system32> 1..5 | PipelineMadnessProcess
BEGIN
$InputArray.Count 0
$input.Count 0
input is false
PROCESS
$InputArray.Count 1
1
$input.Count 1
1
input is true
PROCESS
$InputArray.Count 1
2
$input.Count 1
2
input is true
...
PROCESS
$InputArray.Count 1
5
$input.Count 1
5
input is true
Блок BEGIN вообще не содержит никаких данных.И блок процесса работает хорошо, однако, если бы у вас был foreach
, как в примере, он действительно работал бы, но он бы выполнял foreach
с 1 записью X раз.Или, если вы передадите массив, он будет запускать foreach
один раз с полным набором.
Так что я думаю, что технически пример будет работать, но он может работать не так, как вы ожидаете.
Также обратите внимание, что, хотя блок BEGIN не имел данных, функция прошла проверку синтаксиса.