我正在尝试创建一个Powershell循环,该循环将一个字符串减少到20个字符,然后将其与当前的Active Directory用户进行比较,如果存在,则它将从末尾删除一个字符,然后再次检查。它将继续这样做,直到找到不是当前用户的字符串为止。这是我目前所拥有的:
$uName = (Read-Host "New User Name")
if ($uName.length -gt 20) {
$uNameSAM = $uName.SubString(0, 20)
foreach ($uNameSAMCheck in $uNameSAM) {
Write-Host "`nDue to length limitations shortening Name to: $uNameSAM`n" -Foreground Red
}else {
$uNameSAM = $uName
}
}
这对于缩短部分来说效果很好,但是我不确定如何根据输入的名称检查AD是否存在,是否再次缩短并再次检查等等。
答案 0 :(得分:0)
就像赖利提到的那样,这是一种不寻常的实施模式,但不要让我阻止您。
解决此问题的最简单方法是采用某种形式的循环,在这里我想也许while
循环可能是合适的。
$Username = Read-Host -Prompt "New User Name"
if ($Username.length -gt 20) {
$SamAccountName = $Username.SubString(0, 20)
Write-Warning "Due to length limitations shortening Name to: $uNameSAM"
}
else {
$SamAccountName = $Username
}
while (Get-ADUser -Filter "SamAccountName -eq $SamAccountName") {
$SamAccountName = $SamAccountName.Substring(0, $SamAccountName.Length - 1)
}
Write-Host -ForegroundColor Green "'$SamAccountName' is available!"
有许多可能的方法。这一特定功能利用了您可以利用PS的本机类型强制性这一事实。 while
循环(以及if
语句,until
循环等)期望布尔结果。如果cmdlet完全返回 any 复杂对象,则通常会将其强制为$true
。如果返回的结果为空/空,则将其强制为$false
。
在处理整数,字符串等基本数据类型时,此行为有些棘手,但是对于处理复杂的对象,这是一种非常简单的方法,可以询问“此命令给了我任何输出”。对于Get-ADUser -Filter
,如果过滤器与用户不匹配,则不会生成任何输出。
我们不不想使用Get-ADUser -Identity
,因为不幸的是,如果找不到所需的用户,这将引发终止错误。到处编码可能会有点烦人,因此我选择了-Filter
方法。