PowerShell, как предоставить переменную канала?

#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