2014-12-13 3 views
0

Почему мой цикл происходит только один раз? Я хочу ввести 5 пользователей и добавить их в хеш-таблицу, но код запускается один раз, а затем останавливается. Как это исправить?Powershell While loop Выпуск

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

while ($personCount -le 5){ 
    $personCount++ 
    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 PSCustomObject -Property @{ 
     ID = $userID 
     FirstName = $firstname 
     LastName = $lastname 
    } 
    $personHash.Add($user.ID,$user) 
} 
} 

Выход:

Enter ID: 1001 
Enter First Name: Charles 
Enter Last Name: Whitfield 

Name  Value 
----  ----- 
1001  @{ID=1001; FirstName=Charles; LastName=Whitfield} 
1001  @{ID=1001; FirstName=Charles; LastName=Whitfield} 
1001  @{ID=1001; FirstName=Charles; LastName=Whitfield} 
1001  @{ID=1001; FirstName=Charles; LastName=Whitfield} 
+1

объявление '$ LastName =«'не хватает'»'. Я думаю, что остальная часть вашего кода в порядке. –

+0

У вас также есть ложная закрывающая скобка. –

ответ

1

Ваш цикл выполняется 5 раз.

Проблема заключается в том, что после того, как переменные заполняются в первом цикле, они не выполняют условие While во всех последующих циклах. Он запускается один раз, делая чтение-хост и устанавливая переменные. Затем он работает еще 4 раза, но не находит ничего, что нужно сделать.

Ваш обновленный код ближе. Вы сохраняете данные, но не очищаете переменные для следующего цикла.

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

     while ($personCount -le 5){ 
      $personCount++ 
      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 PSCustomObject -Property @{ 
     ID = $userID 
     FirstName = $firstname 
     LastName = $lastname} 

     $personHash.Add($user.ID,$user) 

     $UserID,$firstname,$lastname = "" 
    } 
+0

Как исправить, поэтому я могу ввести больше, чем по имени? –

+0

Придумайте другой тест для циклов while или сохраните данные в $ UserID, $ firstname и $ last name где-нибудь, а затем очистите эти переменные, чтобы они были готовы к следующему циклу. – mjolinor

+0

Я изменил код, мой пост такой же результат. –

1

Пара проблем здесь, петли while нуждаются в чистых переменных, таких как mjolinor. Как только это будет сделано, я предлагаю экономить, что данные в массиве, поэтому данные каждого пользователя не теряется на следующей итерации:

$users = @() 
$personCount = 1 

while ($personCount -le 5){ 
    $userID="" 
    $firstname="" 
    $lastname="" 
    $personCount++ 

    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" 
    } 
    $users += New-Object -TypeName PSCustomObject -Property @{ 
     userID = $userID; 
     firstName = $firstname; 
     lastName = $lastname 
    } 
} 

После того, как массив $ пользователей есть все данные, вы можете вывести все значения сразу с $users или конкретными пользователями с $users[0], $users[1] и т.д.

1

Это явно не исключено, что код отправил бы создать вывод, который вы размещены. Даже если я сниму две синтаксические ошибки, вы все равно получите четыре ключевых исключения конфликта, потому что вы пытаетесь добавить один и тот же ключ к одной и той же хэш-таблице 5 раз (ключ в хэш-таблице должен быть быть уникальным).

Если вы хотите создать 5 пользовательских объектов в хэш-таблицу и убедитесь, что пользователь вводит значение для всех 3-х свойств вы могли бы сделать что-то вроде этого, если вы хотите дубликат ID бросить ошибку:

$personHash = @{} 

1..5 | % { 
    do { 
    $userID = Read-Host "Enter ID" 
    $firstname = Read-Host "Enter First Name" 
    $lastname = Read-Host "Enter Last Name" 
    } until ($userID -and $firstname -and $lastname) 

    $user = New-Object -Type PSCustomObject -Property @{ 
      'ID'  = $userID 
      'FirstName' = $firstname 
      'LastName' = $lastname 
      } 

    $personHash.Add($userID, $user) 
} 

или как это, если вы хотите дубликат ID обновить текущие значения:

$personHash = @{} 

1..5 | % { 
    do { 
    $userID = Read-Host "Enter ID" 
    $firstname = Read-Host "Enter First Name" 
    $lastname = Read-Host "Enter Last Name" 
    } until ($userID -and $firstname -and $lastname) 

    $user = New-Object -Type PSCustomObject -Property @{ 
      'ID'  = $userID 
      'FirstName' = $firstname 
      'LastName' = $lastname 
      } 

    $personHash[$userID] = $user 
}