我遇到了一些问题,如果输入数字1-52,则应该验证用户输入。然而,由于某种原因,数字6-9是唯一出现错误的数字……
代码如下:
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时会出错,从而导致无限循环。我尝试了几种方法,但似乎就是不能完全正确。
如果有人能帮我理解,我将不胜感激。谢谢。
发布于 2016-04-21 12:52:30
当您使用Read-Host时,输入将变为string,当您随后尝试将$userInput与数字进行比较时,当字符串是单个字符时,它将使用$userInput的ASCII值。
示例:
# 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,如下所示:
(([int]$userInput -lt $minValidNumber) -or ([int]$userInput -gt $maxValidNumber)) -and ($userInput -notlike "f*")发布于 2016-04-21 13:03:28
经过4个小时的反复试验(在发布这个问题之前有3个小时),我终于找到了答案。
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的回答的回应中。
https://stackoverflow.com/questions/36759714
复制相似问题