Как упоминает Райли, это своего рода необычная схема, которую нужно применять, но не позвольте мне остановить вас.
Самый простой способ сделать это - использовать цикл в некоторой форме, здесь я думаю, что цикл 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
и т. Д.) Ожидают логического результата. Если командлет вообще возвращает любой сложный объект, он обычно будет приведен к $true
. Если он возвращает пустой / нулевой результат, он будет приведен к $false
.
Это поведение немного сложнее при работе с базовыми типами данных, такими как целые числа, строки и т. П., Но для работы со сложными объектами это очень простой способ спросить "дала ли мне эта команда любой выход". В случае Get-ADUser -Filter
, если фильтр не соответствует пользователю, выходные данные не генерируются.
Мы не хотим использовать Get-ADUser -Identity
, потому что это, к сожалению, приведет к завершающей ошибке, если он не найдет запрошенного пользователя. Это может немного раздражать, поэтому я выбрал метод -Filter
.