如何在PowerShell中测试变量是否超过8个字符?

67

如何检测$dbUserName中字符数量是否超过八个?

我一直无法找到一个能让我实现此目的的命令或一系列命令。我只能发现变量是否为空:

if ($dbUserName) {
    Write-Output " You left Username blank"
    $dbUserName = read-host
}

但我希望下一次测试是这样的:

if ($dbUserName [String] > 8 ) }
    Write-Output " Please enter more than 8 characters "
    $dbUserName=read-host " Re-enter database user name"
}

4
奇怪,没有人注意到这段代码的逻辑问题。你正在检查用户名的长度是否大于8,并在满足条件时要求他们输入更多字符。因此,如果长度小于或等于8,它将被接受。我认为应该是-lt或-le... - Tad Adams
3个回答

129

使用 [String] 类型的 length 属性:

if ($dbUserName.length -gt 8) {
    Write-Output "Please enter more than 8 characters."
    $dbUserName = Read-Host "Re-enter database username"
}
请注意,在您的if条件中必须使用-gt而不是>。PowerShell使用以下比较运算符来比较值和测试条件:
  • -eq = 等于(==)
  • -ne = 不等于(!=)
  • -lt = 小于(<)
  • -gt = 大于(>)
  • -le = 小于或等于(<=)
  • -ge = 大于或等于(>=)

1
是重定向运算符。我怀疑 -gt 可能是更好的选择。
- mjolinor
@mjolinor 是的,没错。使用多种语言工作的风险。 :) - Ravi K Thapliyal
3
这篇文章的逻辑仍然有缺陷。如果用户名长度大于8个字符,则输出为:“输入超过8个字符?”应该改为-lt。 - LPChip
$var.length 表示我的字符串只有1个字符,但实际上它接近30个字符。 - alexkovelsky
如果我们的输入是 [int] 而不是 [string] 呢? - TylerH

4
您还可以使用-match匹配正则表达式。例如:
if ($dbUserName -match ".{8}" )
{
    Write-Output " Please enter more than 8 characters "
    $dbUserName=read-host " Re-enter database user name"
}

如果你和我一样喜欢让你的代码块中花括号保持水平位置,可以将其放在新的一行。因为它期望一个代码块,所以它会查看下一行。在某些命令中,第一个花括号必须与您的命令内联,您可以使用重音符号(`)告诉PowerShell将下一行视为继续。


3
对于如此简单的任务使用正则表达式似乎会显著地使速度变慢。但在这样一个短暂的操作中,可能甚至察觉不到它的影响。 - Raúl Salinas-Monteagudo
1
如果您想测试8个字符或更少的情况,正则表达式应该是"^.{0,8}$"。但我同意@RaúlSalinas-Monteagudo的观点,这比字符串长度检查需要的速度稍慢且不必要地复杂。 - Twon-ha

0

适用于 Windows PowerShell v7。

您还可以使用三元运算符 ? 如下所示:

PS C:> ("Kipro".Length -gt 8) ? "True" : "False"

输出:False

PS C:> ("Hello, how are you doing?".Length -gt 8) ? "True" : "False"

输出:True

当然,您也可以像下面这样检查保存字符串的变量的条件:

PS C:> $str1="Fort-Ternan"

PS C:> ($str1.Length -gt 8) ? "True" : "False"

输出:True


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接