2014-12-13 3 views
3

Я создаю небольшой скрипт для приема идентификатора пользователя, имени, фамилии, а затем добавления этих данных в хэш-таблицу. Проблема, которую я имею, - это когда я показываю свою хэш-таблицу, говоря, что значением пользователя является System.Object. Что я делаю не так?Powershell Hashtable Issue

$personHash = @{} 
$userID="" 
$firstname="" 
$lastname="" 


    While([string]::IsNullOrWhiteSpace($userID)) 
    { 
     $userID = Read-Host "Enter ID" 
    } 

    While([string]::IsNullOrWhiteSpace($firstname)) 
    { 
     $firstname = Read-Host "Enter First Name" 
    } 


    While([string]::IsNullOrWhiteSpace($lastname)) 
    { 
     $lastname = Read-Host "Enter Last Name" 
    } 


$user = New-Object System.Object 
$user | Add-Member -type NoteProperty -Name ID -value $userID 
$user | Add-Member -type NoteProperty -Name First -value $firstname 
$user | Add-Member -type NoteProperty -Name Last -Value $lastname 
$personHash.Add($user.ID,$user) 

$personHash 
+0

Вы создаете '$ user' как' System.Object'. Что вы ожидаете? –

+0

Попробуйте '$ personHash [$ user.ID]' или '$ personHash ['NameYouEntered']'. Вы видите 'System.Object', потому что хэш-таблица содержит объект этого типа в качестве значения для этой записи. Это заполнитель, который говорит: «Здесь есть объект, но он слишком сложный для отображения». –

+0

@BaconBits - Как я могу исправить этого пользователя, чтобы показать свой объект пользователя правильно? –

ответ

2

Похоже, когда PowerShell отображает содержимое хеш-таблицы, он просто вызывает ToString для объектов в таблице. Он не форматирует их, используя DefaultDisplayPropertySet, как это обычно бывает.

Одним из вариантов является использование PSCustomObject вместо System.Object так:

$user = New-Object PSCustomObject -Property @{ ID = $userID; First = $firstname; Last = $lastname } 
$personHash.Add($user.ID, $user) 

Затем на дисплее будет что-то вроде:

Name   Value 
----   ----- 
1   @{ID=1;First="Mike";Last="Z"} 
+0

Спасибо за это! –

+0

Здесь нет необходимости использовать новый объект. Вы можете просто передать хэш-таблицу в [PSCustomObject]. –

+0

@KeithHill Я считаю, что актер работает только в 3.0+. –

2

Использование [PSCustomObject] для создания на тип, который знает, как PowerShell для вывода строки:

$personHash = @{} 
$userID="" 
$firstname="" 
$lastname="" 

While([string]::IsNullOrWhiteSpace($userID)) 
{ 
    $userID = Read-Host "Enter ID" 
} 

While([string]::IsNullOrWhiteSpace($firstname)) 
{ 
    $firstname = Read-Host "Enter First Name" 
} 

While([string]::IsNullOrWhiteSpace($lastname)) 
{ 
    $lastname = Read-Host "Enter Last Name" 
} 

$personHash[$userID] = [pscustomobject]@{ID=$userID; First=$firstname; Last=$lastname} 
$personHash 
+0

Спасибо! :-) –

Смежные вопросы