PowerShell, как предоставить переменную канала? - PullRequest
1 голос
/ 09 марта 2019

Это вопрос высокого уровня, поскольку детали могут быть не точными, поскольку я не в своем офисе, а дома.

У меня есть функция, которая принимает переменные через канал:

get-csv | myfunc

Источником канала являются поля из файла .csv.

Как определить переменные и канал в myfunc()? HashTable было бы хорошо?

$my_pipe_variables = @{ Color = ‘Red’; Doors = 4; Convertible = $false}
$my_pipe_variables | myfunc

это будет правильный синтаксис?

Обновление:

Наконец-то я нашел способ попробовать, но у меня это не работает, так как мой myfunc напрямую обращается к переменным канала через $_. Вот демо:

function showThem { echo Color: $_.Color }

> [pscustomobject]@{ Color = ‘Red’; Doors = 4; Convertible = $false} | showThem
Color:

Как я могу заставить его работать для myfunc, который напрямую обращается к переменным канала через $_?

1 Ответ

3 голосов
/ 09 марта 2019

Import-Csv (не Get-Csv), для чтения данных CSV из файла и ConvertFrom-Csv, для чтения данных CSV из string , выводит коллекцию пользовательских объектов (тип [pscustomobject]) , свойства которых отражают столбцы данных CSV.

Для создания таких пользовательских объектов по требованию, чтобы имитировать Import-Csv / ConvertFrom-Csv input , используйте синтаксис
[pscustomobject] @{ <propertyName>=<value>; ... } (PSv3 +).

Например, для моделирования 2 строк данных CSV со столбцами Color, Doors, и Convertible:

[pscustomobject] @{ Color = 'Red'; Doors = 4; Convertible = $false },
[pscustomobject] @{ Color = 'Blue'; Doors = 5; Convertible = $false } |
  ...

Отдельно для того, чтобы функция могла вводить данные из конвейера объект за объектом через автоматическую переменную $_, он должен иметь process { ...} блок - см. Раздел справки about_Functions .

# 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
...