![объект конвейера powershell для функционирования](https://rvso.com/image/658758/%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%20%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%B0%20powershell%20%D0%B4%D0%BB%D1%8F%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F.png)
Вот краткое содержание того, что я пытаюсь сделать:
function Set-test {
[CmdletBinding()]
param(
[Parameter(Mandatory=$True,
ValueFromPipeline=$True)]
[object[]]$inputObject
)
Write-Verbose "Set-test: input obj= $inputObject"
PROCESS {
foreach ($obj in $inputobject) {
Write-Output $obj
}
}
}
function Get-test {
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name "swName" -Value "banana"
$obj | Add-Member -MemberType NoteProperty -Name "Version" -Value "3.2.2"
Write-Output "obj = $obj"
$obj | Set-test -verbose
}
Вот что получилось:
PS > Get-test
obj = @{swName=banana; Version=3.2.2}
VERBOSE: Set-test: input obj=
Get-Process : Cannot evaluate parameter 'Name' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input.
At C:\Users\username\Documents\WindowsPowerShell\Modules\mytool\mytools.psm1:204 char:13
+ PROCESS {
+ ~
+ CategoryInfo : MetadataError: (:) [Get-Process], ParameterBindingException
+ FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.GetProcessCommand
Как видно из подробного вывода, объект не передается в функцию, и это меня озадачивает.
решение1
Вы не можете иметь эту write-verbose в set-test вне блока begin{}, process{} или end{}. Это все портит. Если вы переместите его внутрь блока process{}, то все будет работать нормально.