Powershell,检查空白输入,零计算为 blank/null
Powershell, check for blank input, zero evaluates as blank/null
我正在尝试验证一个简单的 powershell 输入。我想允许数字零作为有效输入,但空白(只需按回车键)不是有效输入。我在验证方面遇到了最困难的时期。一切正常,除非用户输入数字零。
我试过检查长度,检查空值等。
考虑下面的代码。
如果您输入 0(零),则输出与您仅按 [enter](无输入)
相同
Pick a number 0-6: 0
You picked 0
blank input
equals zero
too short
$OUchoice = -1
do
{
try{
$OUchoice = Read-Host "Pick a number 0-6"
}
catch{
write-host "invalid input"
}
Write-Host "You picked $OUchoice"
if ($OUchoice -gt 6) {write-host "too high"}
if ($OUchoice -lt 0) {write-host "too low"}
if ($OUchoice -eq "") {write-host "blank input"}
if ($OUchoice -eq 0 ) {write-host "equals zero"}
if ($OUchoice -eq $null ) {write-host "Null"}
if (!($OUchoice)) {write-host "too short"}
}
until (($OUchoice -ge 0) `
-and ($OUchoice -le 6) `
-and (($ouchoice)))
write-host "OK"
我试过 -eq $NULL 和 -eq ""。允许零输入和不允许空白输入的正确方法是什么?
这是我想到的。当您将它与其他数字进行比较时,我确保 $OUChoice 是一个 Int。这确保空输入是 0 并且还允许负值。
$OUchoice = -1
do
{
try{
$OUchoice = Read-Host "Pick a number 0-6"
}
catch{
write-host "invalid input"
}
Write-Host "You picked $OUchoice"
Switch ($OUchoice) {
{
[string]::IsNullOrEmpty($OUchoice)} {
write-host "Null Input"
Break
}
{
[int]$OUchoice -gt 6} {
write-host "too high"
Break
}
{
[int]$OUchoice -lt 0} {
write-host "too low"
Break
}
{
[int]$OUchoice -eq 0 } {
write-host "equals zero"
Break
}
}
}
until (([int]$OUchoice -ge 0) -and ([int]$OUchoice -le 6) -AND (-NOT [string]::IsNullOrEmpty($OUchoice)))
write-host "OK"
问题出在这里:
PS> 0 -eq ""
True
当比较两个不同类型的值时,第二个参数转换为第一个参数的类型。不幸的是你:
PS> [int]""
0
转换为 int
时的空字符串会生成 0
。在您的情况下,修复很简单:只需反转操作数的顺序,因为 0
转换为字符串最终会成为 '0'
:
if ("" -eq $OUchoice) {write-host "blank input"}
嵌套你的 ifs(我没有测试太多,但确实检查了零和空白的情况):
if (-not ($OUchoice -eq ""))
{
if ($OUchoice -gt 6) {write-host "too high"}
if ($OUchoice -lt 0) {write-host "too low"}
if ($OUchoice -eq 0 ) {write-host "equals zero"}
if ($OUchoice -eq $null ) {write-host "Null"}
if (!($OUchoice)) {write-host "too short"}
}
else
{
Write-Output "blank input"
}
输出:
PS C:\users\mattp_000> .\x.ps1
Pick a number 0-6:
You picked
blank input
Pick a number 0-6: 0
You picked 0
equals zero
OK
PS C:\users\mattp_000> .\x.ps1
Pick a number 0-6: 3
You picked 3
OK
PS C:\users\mattp_000>
我正在尝试验证一个简单的 powershell 输入。我想允许数字零作为有效输入,但空白(只需按回车键)不是有效输入。我在验证方面遇到了最困难的时期。一切正常,除非用户输入数字零。 我试过检查长度,检查空值等。 考虑下面的代码。 如果您输入 0(零),则输出与您仅按 [enter](无输入)
相同Pick a number 0-6: 0
You picked 0
blank input
equals zero
too short
$OUchoice = -1
do
{
try{
$OUchoice = Read-Host "Pick a number 0-6"
}
catch{
write-host "invalid input"
}
Write-Host "You picked $OUchoice"
if ($OUchoice -gt 6) {write-host "too high"}
if ($OUchoice -lt 0) {write-host "too low"}
if ($OUchoice -eq "") {write-host "blank input"}
if ($OUchoice -eq 0 ) {write-host "equals zero"}
if ($OUchoice -eq $null ) {write-host "Null"}
if (!($OUchoice)) {write-host "too short"}
}
until (($OUchoice -ge 0) `
-and ($OUchoice -le 6) `
-and (($ouchoice)))
write-host "OK"
我试过 -eq $NULL 和 -eq ""。允许零输入和不允许空白输入的正确方法是什么?
这是我想到的。当您将它与其他数字进行比较时,我确保 $OUChoice 是一个 Int。这确保空输入是 0 并且还允许负值。
$OUchoice = -1
do
{
try{
$OUchoice = Read-Host "Pick a number 0-6"
}
catch{
write-host "invalid input"
}
Write-Host "You picked $OUchoice"
Switch ($OUchoice) {
{
[string]::IsNullOrEmpty($OUchoice)} {
write-host "Null Input"
Break
}
{
[int]$OUchoice -gt 6} {
write-host "too high"
Break
}
{
[int]$OUchoice -lt 0} {
write-host "too low"
Break
}
{
[int]$OUchoice -eq 0 } {
write-host "equals zero"
Break
}
}
}
until (([int]$OUchoice -ge 0) -and ([int]$OUchoice -le 6) -AND (-NOT [string]::IsNullOrEmpty($OUchoice)))
write-host "OK"
问题出在这里:
PS> 0 -eq ""
True
当比较两个不同类型的值时,第二个参数转换为第一个参数的类型。不幸的是你:
PS> [int]""
0
转换为 int
时的空字符串会生成 0
。在您的情况下,修复很简单:只需反转操作数的顺序,因为 0
转换为字符串最终会成为 '0'
:
if ("" -eq $OUchoice) {write-host "blank input"}
嵌套你的 ifs(我没有测试太多,但确实检查了零和空白的情况):
if (-not ($OUchoice -eq ""))
{
if ($OUchoice -gt 6) {write-host "too high"}
if ($OUchoice -lt 0) {write-host "too low"}
if ($OUchoice -eq 0 ) {write-host "equals zero"}
if ($OUchoice -eq $null ) {write-host "Null"}
if (!($OUchoice)) {write-host "too short"}
}
else
{
Write-Output "blank input"
}
输出:
PS C:\users\mattp_000> .\x.ps1
Pick a number 0-6:
You picked
blank input
Pick a number 0-6: 0
You picked 0
equals zero
OK
PS C:\users\mattp_000> .\x.ps1
Pick a number 0-6: 3
You picked 3
OK
PS C:\users\mattp_000>