#powershell #object #pipe #pscustomobject
#powershell #объект #канал #pscustomobject
Вопрос:
Это вопрос высокого уровня, поскольку детали могут быть неточными, поскольку я нахожусь не в своем офисе, а дома.
У меня есть функция, которая принимает переменные через канал:
get-csv | myfunc
Источником канала являются поля из файла .csv.
Как определить переменные и передать в myfunc()
? HashTable
Было бы хорошо?
$my_pipe_variables = @{ Color = ‘Red’; Doors = 4; Convertible = $false}
$my_pipe_variables | myfunc
это был бы правильный синтаксис?
Обновить:
Я, наконец, решился попробовать это, но у меня это не работает, так как my myfunc
обращается к переменным канала напрямую через $_
. Вот демонстрация:
function showThem { echo Color: $_.Color }
> [pscustomobject]@{ Color = ‘Red’; Doors = 4; Convertible = $false} | showThem
Color:
Как я могу заставить это работать для myfunc
, который обращается к переменным канала напрямую через $_
?
Комментарии:
1. @mklement0, мое единственное намерение — заменить чтение из .csv на предоставление переменной from, все остальное уходит в тень. Пожалуйста, проигнорируйте и покажите мне правильный способ сделать это, для примера .csv ввода
Color = ‘Red’; Doors = 4; Convertible = $false
. thx.2. Вместо конвейера вы можете использовать хэш-таблицу для разбиения параметров вашей функции. P.s. избавьтесь от фигурных «смарт-кавычек» и используйте прямые.
3. Спасибо за ссылку @Theo. Это может не подходить для моего конкретного случая, поскольку я получаю
myfunc()
доступ к переменным канала напрямую через$_.
вместо определенияParam
s.
Ответ №1:
Import-Csv
(не Get-Csv
), для чтения CSV-данных из файла и ConvertFrom-Csv
для чтения CSV-данных из строки, выведите коллекцию пользовательских объектов (type [pscustomobject]
), свойства которых отражают столбцы CSV-данных.
Чтобы создавать такие пользовательские объекты по требованию для имитации Import-Csv
/ ConvertFrom-Csv
ввода, используйте [pscustomobject] @{ <propertyName>=<value>; ... }
синтаксис (PSv3 ).
Например, для имитации 2 строк CSV-данных со столбцами Color
, Doors
и Convertible
:
[pscustomobject] @{ Color = 'Red'; Doors = 4; Convertible = $false },
[pscustomobject] @{ Color = 'Blue'; Doors = 5; Convertible = $false } |
...
Отдельно, чтобы заставить функцию обрабатывать входные данные из конвейера объект за объектом с помощью автоматической переменной $_
, у нее должен быть process { ...}
блок — см. раздел справки о_функциях.
# Define the function body with a process { ... } block, which
# PowerShell automatically calls for each input object from the pipeline,
# reflected in automatic variable $_
function showThem { process { "Color: " $_.Color } }
[pscustomobject] @{ Color = 'Red'; Doors = 4; Convertible = $false },
[pscustomobject] @{ Color = 'Blue'; Doors = 5; Convertible = $false } |
showThem
Примечание: В PowerShell echo
это псевдоним Write-Output
, чье явное использование редко требуется; вместо этого функция полагается на неявный вывод PowerShell: результат конкатенации строк (
) неявно становится выводом функции.
Приведенное выше приводит:
Color: Red
Color: Blue