Re (a):
Если ваша функция видит @{computername=HOSTNAME}
вместо HOSTNAME
, это означает, что вы делаете что-то вроде:
Import-Csv ... | Select-Object ComputerName | Get-InstalledApps
вместоОбязательно:
Import-Csv ... | Select-Object -ExpandProperty ComputerName | Get-InstalledApps
Обратите внимание на переключатель -ExpandProperty
, который необходим для извлечения отдельного свойства значение из входных данных;без него вы получите объект с этим свойством - подробности см. в этом ответе .
Re (b):
Чтобы принять объект-объектный конвейерный ввод, ваша функция должна иметь блок process { ... }
:
function Get-InstalledApps {
Param (
[CmdletBinding()]
[Parameter(ValueFromPipeline=$true)]
[Alias('name')]
[string[]]$computers = $env:COMPUTERNAME
)
process { # This ensures that the following code is called for each input object.
foreach ($computer in $computers){
# ...
}
}
}
См. Get-Help about_Functions_Advanced
.
Обратите внимание, что если вы только ожидаете, что ваша функция получит список имен компьютеров через pipe (... | Get-InstalledApps
), а не по параметру (Get-InstalledApps -Computers ...
)), вы можете объявить параметр -Computers
как просто [string]
(а не как массив ), что устраняет необходимость в цикле foreach
внутри блока process { ... }
.
Дляобсуждение этой разницы, см. этот выпуск GitHub .