Создание нового объекта / таблицы, правильный формат?

#powershell #scripting

#powershell #сценарии

Вопрос:

 $token = 'xxxxxxxxxxxxxxxx'
#First uri is to pull a list of subusers
$uri = "https://api.sendgrid.com/v3/subusers"

$uri2 = "https://api.sendgrid.com/v3/teammates?limit=500amp;offset=0"
#Prompts for target email address
$email = Read-Host "Enter the users email"

$headers1 = @{"Authorization" = "Bearer $token"}

#Get a list of all subusers
$subs = Invoke-RestMethod -Method get -uri $uri -headers $headers1
$subuser = $subs | select-object username

#Loop through all subusers, displaying usernames
foreach ($su in $subuser){
    $headers2 = @{"Authorization" = "Bearer $token" 
     "on-behalf-of" = $su.username
}
   $teamarray = invoke-restmethod -method get -uri $uri2 -headers $headers2
   #$teamarray.gettype()
   
   #$teamarray.result | select-object username 
}

#[pscustomobject]@{
 #   Subuser = $subuser
  #  TeamMate = $teamarray
   # }

$objSubuserTMTable = [ordered]@{
    SubUser = $subuser;
    Username = $teamarray
    }

new-object PSObject -property $objSubuserTMTable | format-table
 

Итак, эта часть моего скрипта создает таблицу, за исключением того, что это не так. Я получаю 1 усеченную строку, состоящую из обоих столбцов. Какой правильный синтаксис для правильного форматирования этого как таблицы с двумя столбцами?

Спасибо!

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

1. Вы создали 1 объект, поэтому таблица с ровно 1 строкой — это то, что вы должны ожидать.

2. Итак .. вы говорите, что таблица должна содержать несколько объектов, если вы хотите, чтобы в ней было несколько столбцов?

3. Да! Это $teamarray массив имен пользователей? Если это так, вы захотите создать 1 объект для каждого имени пользователя

4. О боже .. да, это массив, но он может различаться по длине. Я, конечно, не хочу создавать объект за… Должен быть какой-то способ.

5. Почему бы и нет? Вам не нужно заранее знать количество — foreach($username in $teamarray){ ... }

Ответ №1:

Я не совсем уверен, как бы вы хотели, чтобы это было отформатировано, но вы можете объединить все имена пользователей TeamArray вместе, как показано ниже (я использую точку с запятой):

 $objSubuserTMTable = foreach ($su in $subuser){
    $headers2 = @{
        "Authorization" = "Bearer $token" 
        "on-behalf-of" = $su.username
    }
    $teamarray = Invoke-RestMethod -Method Get -Uri $uri2 -Headers $headers2
    [PsCustomObject]@{
        SubUser  = $su.username
        Username = ($teamarray.result | Select-Object -ExpandProperty username) -join '; '
    }
}


# output on screen. Will truncate if this exceeds the with of the console
$objSubuserTMTable | Format-Table -AutoSize

# output to CSV file you can open in Excel (not truncated)
$objSubuserTMTable | Export-Csv -Path 'PathToTheTeamUsersFile.csv' -NoTypeInformation
 

Ответ №2:

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

 $subuser = "subuser"
$teamarray = "username"

$objSubuserTMTable = [ordered]@{
    SubUser = $subuser;
    Username = $teamarray
    }

new-object PSObject -property $objSubuserTMTable | format-table
 

Вывод:

 SubUser Username
------- --------
subuser username
 

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

1. Интересно… Я отредактировал свой пост, чтобы включить весь сценарий. Все еще не могу понять..

Ответ №3:

Если вам нужно несколько строк, у вас должно быть несколько строк данных. Формат таблицы работает с наборами, где каждый объект представляет строку

 $objSubuserTMTable = @(
    [PSCustomObject]@{
        SubUser = 'subuser1'
        Username = 'teamarray1'
    }
    [PSCustomObject]@{
        SubUser = 'subuser2'
        Username = 'teamarray2'
    }
    [PSCustomObject]@{
        SubUser = 'subuser3'
        Username = 'teamarray3'
    }
)
$objSubuserTMTable | format-table
 

Вывод:

 SubUser  Username
-------  --------
subuser1 teamarray1
subuser2 teamarray2
subuser3 teamarray3