PowerShell: Выражение только с последним элементом массива

#powershell

Вопрос:

Я застрял на этом некоторое время, однако у меня есть множество людей, и я пытаюсь найти последнего человека и создать отдельную колонку только с этим человеком.

Я играл с @{NAME = 'NAME' Expression = {}} Select-Object ним, но на самом деле не знаю, как с этим справиться.

Текущий:

 | Employee      |
|---------------|
| John Doe      |
| Jane West     |
| Jordan Row    |
| Paul Willson  |
| Andrew Wright |
 

желаемый результат:

 | Employee     | Employee2     |
|--------------|---------------|
| John Doe     |               |
| Jane West    |               |
| Jordan Row   |               |
| Paul Willson | Andrew Wright |
 

ТИА!

Комментарии:

1. Это странное требование, но ладно 🙂 Когда вы говорите 2-й столбец, вы хотите, чтобы объект, последний объект, имел свойство сотрудника = «Пол Уилсон» и другое свойство под названием Employee2 = «Эндрю Райт», но все остальные значения должны иметь только свойство сотрудника? Или когда вы говорите «столбцы», вы в основном хотите получить этот вывод в формате csv?

2. @Даниэль, эта первая часть-именно то, что я хочу! 🙂

Ответ №1:

Поэтому я решил создать здесь 2 группы. Одна группа содержит все значения, кроме последних 2, а другая группа содержит эти последние 2 значения

 # create the sample array
$employees = @(
    'John Doe'
    'Jane West'
    'Jordan Row'
    'Paul Willson'
    'Andrew Wright'
)

$employees | 
# Separate objects into 2 groups: those contained in the last 2 values and those not contained in the last 2 values
Group-Object {$_ -in ($employees | Select-Object -Last 2)} | 
    ForEach-Object {
        switch ($_) {
            {$_.name -eq 'False'} {  # 'False' Name of group where values are not one of the last 2

                # Iterate through all the values and assign them to Employee property.  Leave Employee2 property blank
                $_.group | ForEach-Object {
                    [PSCustomObject]@{
                        Employee  = $_
                        Employee2 = ''
                    }
                }
            }
            {$_.name -eq 'True'} {  # 'True' Name of group where values are those of the last 2
                # Create an object that assigns the values to Employee and Employee2
                [PSCustomObject]@{
                    Employee  = $_.group[0]
                    Employee2 = $_.group[1]
                }
            }
        }
    }
 

Выход

 Employee     Employee2
--------     ---------
John Doe
Jane West
Jordan Row
Paul Willson Andrew Wright
 

Редактировать

Вот еще один способ, которым вы можете это сделать

 $employees[0..($employees.Count-3)] | ForEach-Object {
    [PSCustomObject]@{
        Employee = $_
        Employee2 = ''
    }

}

[PSCustomObject]@{
    Employee = $employees[-2]
    Employee2 = $employees[-1]
}