2016-04-21 5 views
1

Ich stoße auf einige Probleme, bei denen die Benutzereingabe validiert werden sollte, wenn die Nummern 1-52 eingegeben werden. Allerdings Zahlen 6-9 die nur Zahlen sind, wird es einen Fehler aus irgendeinem Grund geben ...Ist es nur ich oder ist Powershell Probleme beim Lesen Bereich von Zahlen 6-9 (von 1-52)?

Hier ist der Code:

Function PrintArrayAsGridWithDisplayNumber 
{ 
    param([string[]]$Array,[ValidateRange(1,24)][int]$ColumnCount) 

    [int]$arrDisplayNumCounter = 1 
    $GridSplat = @{ 
     InputObject = $Array|ForEach-Object { 
      New-Object psobject -Property @{'Value' = "$arrDisplayNumCounter - " + $_}; 
      $arrDisplayNumCounter++ 
     } 
     Property = 'Value' 
    } 

    if(-not $PSBoundParameters.ContainsKey('ColumnCount')) 
    { 
     $GridSplat['AutoSize'] = $true 
    } 
    else 
    { 
     $GridSplat['Column'] = $ColumnCount 
    } 

    $table = Format-Wide @GridSplat | Out-String 
    Write-Host $table 
} 

Function AskUserSelectUserPropertiesToQueryAD 
{ 
Param() 
[String[]]$validAdProperties = @('SamAccountName', 'msRTCSIP-UserEnabled', 'msRTCSIP-OptionFlags', 'msRTCSIP-PrimaryUserAddress', 'msRTCSIP-PrimaryHomeServer', 
'mail', 'msExchMasterAccountSid', 'homeMDB', 'proxyaddresses', 'legacyExchangeDN', 
'lastLogonTimestamp', 'logonCount', 'lastLogoff', 'lastLogon', 'pwdLastSet', 'userAccountControl', 'whenCreated', 'whenChanged', 'accountExpires', 
'sn', 'givenName', 'displayName', 'distinguishedName', 'initials', 'l', 'st', 'street', 'title', 'description', 'postalCode', 'physicalDeliveryOfficeName', 
'telephoneNumber', 'facsimileTelephoneNumber', 'info', 'memberOf', 'co', 'department', 'company', 'streetAddress', 'employeeNumber', 'employeeType', 'objectGUID', 
'employeeID', 'homeDirectory', 'homeDrive', 'scriptPath', 'objectSid', 'userPrincipalName', 'url', 'msDS-SourceObjectDN', 'manager', 'extensionattribute8') 
[Int]$displayDemoNumber = 40 
[Int]$numOfDisplayColumns = 3 
[String]$displayDemoNumberValue = $validAdProperties[$displayDemoNumber - 1] 

PrintArrayAsGridWithDisplayNumber $validAdProperties $numOfDisplayColumns 

$selectedAdPropertiesQuery = @() 
$minValidNumber = 1 
$maxValidNumber = $validAdProperties.length 
While (($userInput -notlike "f*")) 
{ 
    # Ask user input 
    If (!($selectedAdPropertiesQuery)) 
    { 
     $userInput = Read-Host " Enter number to select property to export in search results csv file (e.g.: for $displayDemoNumberValue, enter $displayDemoNumber)" 
    } Else { 
     $userInput = Read-Host " Enter number to select property to add in search results csv file, or enter `"f`" if finished" 
    } 

    # Write error if user input was not valid number or f. Else add search value to array if number is valid and not like f. 
    If ((($userInput -lt $minValidNumber) -or ($userInput -gt $maxValidNumber)) -and ($userInput -notlike "f*")) # write warning and do not include input as a value 
    { 
     Write-Host '$minValidNumber =' $minValidNumber 
     Write-Host '$maxValidNumber =' $maxValidNumber 
     Write-Host '$userInput =' $userInput 
     Write-Warning "Invalid number entered: $userInput `nnumber was out of range($minValidNumber - $maxValidNumber)" 
     Write-Host "" 
    } ElseIf ((($userInput -ge $minValidNumber) -or ($userInput -le $maxValidNumber)) -and ($userInput -notlike "f*")) { 
     $userValidatedInput = $validAdProperties[$userInput - 1] # selected property 
     $selectedAdPropertiesQuery += $userValidatedInput 
     Write-Host "User Properties Selected = $selectedAdPropertiesQuery" 
     Write-Host "" 
    } 
} 

Write-Output $selectedAdPropertiesQuery 
} 

AskUserSelectUserPropertiesToQueryAD 

enter image description here

Hinweis: Wenn ich die Read-Host-[Int]Read-Host werfen , die Nummern werden erfolgreich sein, aber es wird ein Fehler ausgegeben, wenn Sie f eingeben, was eine Endlosschleife verursacht. Ich habe verschiedene Dinge ausprobiert, aber ich kann es einfach nicht richtig verstehen.

Wenn jemand mir helfen könnte zu verstehen, würde ich es begrüßen. Vielen Dank.

Antwort

3

Wenn Sie Read-Host verwenden, wird die Eingabe eine string, wenn Sie dann versuchen, $userInput Zahlen zu vergleichen, ist es den ASCII-Wert für $userInput verwendet, wenn die Zeichenfolge ein einzelnes Zeichen ist.

Beispiel:

# If I input 6 here... 
$userInput = Read-Host " Enter number to select property to add in search results csv file, or enter 'f' if finished" 

# ...this will show 54 
[byte][char]$userInput 

# if Max is set to 52, this will be true, since 54 is naturally larger than 52 
$userInput -gt $maxValidNumber 

Um dies zu beheben, können Sie versuchen $userInput mit [int] in Ihren Scheck in einen int zu zwingen, wie folgt aus:

(([int]$userInput -lt $minValidNumber) -or ([int]$userInput -gt $maxValidNumber)) -and ($userInput -notlike "f*") 
+0

Problem ist die Eingabe 'f' druckt immer noch einen Fehler, weil es immer noch, es zu konvertieren versucht. Endlich fand ich die Antwort, nachdem ich 4 Stunden daran gearbeitet hatte. Es läuft im Grunde darauf hinaus, mehrere Umwandlungen zu verwenden (denn auch nach dem Durchlaufen der Schleife bleibt die vorherige Umwandlung bei der Neuzuordnung mit dem Variablennamen hängen). Ich werde die Antwort unten posten. –

+0

Ich danke Ihnen, dass Sie mir den Grund gezeigt haben, warum es nicht als Int gelesen wird. Der Standardtyp für die Zuweisung einer Variablen ist [Byte] [Char], sofern sie nicht auf einen bestimmten Typ angewendet wird. Das wird in der Zukunft gut zu wissen sein, und technisch beantwortet es die Frage, warum es es nicht liest. –

1

Nach 4 Stunden von Versuch und Irrtum (3 vor dem Stellen dieser Frage) fand ich schließlich die Antwort. int

Function PrintArrayAsGridWithDisplayNumber 
{ 
    param([string[]]$Array,[ValidateRange(1,24)][int]$ColumnCount) 

    [int]$arrDisplayNumCounter = 1 
    $GridSplat = @{ 
     InputObject = $Array|ForEach-Object { 
      New-Object psobject -Property @{'Value' = "$arrDisplayNumCounter - " + $_}; 
      $arrDisplayNumCounter++ 
     } 
     Property = 'Value' 
    } 

    if(-not $PSBoundParameters.ContainsKey('ColumnCount')) 
    { 
     $GridSplat['AutoSize'] = $true 
    } 
    else 
    { 
     $GridSplat['Column'] = $ColumnCount 
    } 

    $table = Format-Wide @GridSplat | Out-String 
    Write-Host $table 
} 

Function AskUserSelectUserPropertiesToQueryAD 
{ 
    [String[]]$validAdProperties = @('SamAccountName', 'msRTCSIP-UserEnabled', 'msRTCSIP-OptionFlags', 'msRTCSIP-PrimaryUserAddress', 'msRTCSIP-PrimaryHomeServer', 
    'mail', 'msExchMasterAccountSid', 'homeMDB', 'proxyaddresses', 'legacyExchangeDN', 
    'lastLogonTimestamp', 'logonCount', 'lastLogoff', 'lastLogon', 'pwdLastSet', 'userAccountControl', 'whenCreated', 'whenChanged', 'accountExpires', 
    'sn', 'givenName', 'displayName', 'distinguishedName', 'initials', 'l', 'st', 'street', 'title', 'description', 'postalCode', 'physicalDeliveryOfficeName', 
    'telephoneNumber', 'facsimileTelephoneNumber', 'info', 'memberOf', 'co', 'department', 'company', 'streetAddress', 'employeeNumber', 'employeeType', 'objectGUID', 
    'employeeID', 'homeDirectory', 'homeDrive', 'scriptPath', 'objectSid', 'userPrincipalName', 'url', 'msDS-SourceObjectDN', 'manager', 'extensionattribute8') 
    [Int]$displayDemoNumber = 40 
    [Int]$numOfDisplayColumns = 3 
    [String]$displayDemoNumberValue = $validAdProperties[$displayDemoNumber - 1] 

    PrintArrayAsGridWithDisplayNumber $validAdProperties $numOfDisplayColumns 

    $selectedAdPropertiesQuery = @() 
    $minValidNumber = 1 
    $maxValidNumber = $validAdProperties.length 
    While (($userInput -notlike "f*")) 
    { 
     [Bool]$invalidInput = $false 
     # Ask user input 
     If (!($selectedAdPropertiesQuery)) 
     { 
      [String]$userInput = (Read-Host " Enter number to select property to export in search results csv file (e.g.: for $displayDemoNumberValue, enter $displayDemoNumber)").Trim() 
     } Else { 
      [String]$userInput = (Read-Host " Enter number to select property to add in search results csv file, or enter `"f`" if finished").Trim() 
     } 


     Write-Host '$userInput =' $userInput 
     If ($userInput -notlike "f*") 
     { 
      Try { 
       [Int]$userInput = $userInput 
      } Catch { 
       Write-Warning "Your input is not a number or `"f`"" 
       [Bool]$invalidInput = $true 
      } 
     } 

     # Write error if user input was not valid number or f. Else add search value to array if number is valid and not like f. 
     If ((($userInput -lt $minValidNumber) -or ($userInput -gt $maxValidNumber)) -and ($userInput -notlike "f*") -and (!($invalidInput))) # write warning and do not include input as a value 
     { 
      Write-Host '$minValidNumber =' $minValidNumber 
      Write-Host '$maxValidNumber =' $maxValidNumber 
      Write-Host '$userInput =' $userInput 
      Write-Warning "Invalid number entered: $userInput `nnumber was out of range($minValidNumber - $maxValidNumber)" 
      Write-Host "" 
     } ElseIf ((($userInput -ge $minValidNumber) -or ($userInput -le $maxValidNumber)) -and ($userInput -notlike "f*") -and (!($invalidInput))) { 
      $userValidatedInput = $validAdProperties[$userInput - 1] # selected property 
      $selectedAdPropertiesQuery += $userValidatedInput 
      Write-Host "User Properties Selected = $selectedAdPropertiesQuery" 
      Write-Host "" 
     } 
    } 
    Write-Output $selectedAdPropertiesQuery 
} 

AskUserSelectUserPropertiesToQueryAD 

Einzelheiten sind in meinem Kommentar zu Negorath Antwort reagieren ...

+0

_Details sind in meinem Kommentar als Antwort auf Negoraths Antwort ..._. Nein. Sie sollten hier in Ihrer Antwort sein, damit die Leute nicht nach ihnen suchen müssen. Was passiert, wenn diese Kommentare gelöscht werden? – Matt