我正在尝试编写一个 powershell 脚本,要求用户输入一个 4 位数的 PIN,如果该数字不等于 4,则会发出警告。
这是我所拥有的,但它似乎不起作用......
[int]$userPin = read-host 'type in your user pin'
if ($userPin.length -ne 4) {
write-host "Error, Pin must be 4 numbers"
}
无论如何,此代码都会写入错误消息... 任何帮助表示赞赏! 谢谢!
最佳答案
$userPin = while ($true) {
$entered = Read-Host 'type in your user pin'
if ($entered.Trim() -match '^\d{4}$') { [int] $entered; break }
Write-Warning "$entered is not a 4-digit number; please try again."
}
上面一直提示,直到输入一个 4 位数字,并将其作为 [int]
实例存储在变量 $userPin
中。
请注意 regex 首先使用匹配来确保刚好输入 4 个十进制数字 (\d{4}
)[1],使用 -匹配
,regular-expression matching operator .这样一来,预先排除了输入非数字的可能性,而不会导致将非数字的值直接转换为 [int]
时出现的错误。
至于你尝试了什么:
通过类型约束您的$userPin
变量来键入[int]
([int] $userPin = ...
),您将其值(初始值和以后分配的任何值)强制为该类型,并且 [int]
( System.Int32
) 的实例没有 。 Length
属性(而从 Read-Host
返回的原始 [string]
实例有)。
默认情况下,PowerShell 会忽略访问不存在的属性的尝试并返回 $null
,因此您的 $userPin.length -ne 4
条件等同于 $null -ne 4
,始终为真。
[1] 严格来说,\d
不仅匹配 ASCII 范围的十进制数字 0
到 9
,还匹配其他Unicode 字符也归类为数字。要消除歧义,您可以改用 [0-9]
,尽管在实践中可能很少需要这样做。
关于PowerShell:如何检查为用户密码输入了多少位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68514343/