首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是我的问题,还是powershell在读取6-9 (满分为1-52)的数字时遇到了问题?

是我的问题,还是powershell在读取6-9 (满分为1-52)的数字时遇到了问题?
EN

Stack Overflow用户
提问于 2016-04-21 12:31:52
回答 2查看 75关注 0票数 1

我遇到了一些问题,如果输入数字1-52,则应该验证用户输入。然而,由于某种原因,数字6-9是唯一出现错误的数字……

代码如下:

代码语言:javascript
复制
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

注意:如果我将Read-Host转换为[Int]Read-Host,数字将会成功,但当您输入f时会出错,从而导致无限循环。我尝试了几种方法,但似乎就是不能完全正确。

如果有人能帮我理解,我将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-04-21 12:52:30

当您使用Read-Host时,输入将变为string,当您随后尝试将$userInput与数字进行比较时,当字符串是单个字符时,它将使用$userInput的ASCII值。

示例:

代码语言:javascript
复制
# 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

要解决此问题,您可以尝试在使用[int]检查时强制$userInput为int,如下所示:

代码语言:javascript
复制
(([int]$userInput -lt $minValidNumber) -or ([int]$userInput -gt $maxValidNumber)) -and ($userInput -notlike "f*")
票数 3
EN

Stack Overflow用户

发布于 2016-04-21 13:03:28

经过4个小时的反复试验(在发布这个问题之前有3个小时),我终于找到了答案。

代码语言:javascript
复制
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

详细信息在我对Negorath的回答的回应中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36759714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档