#powershell #powershell-3.0 #powershell-4.0
#powershell #powershell-3.0 #powershell-4.0
Вопрос:
У меня есть небольшой фрагмент кода, который мне пришлось запускать на годовом уровне, и я хотел заставить его выполняться в цикле do while, чтобы кода было не так много. Идея в том, что код сохранит переменную со строкой и int, то есть .. yr1, yr2, yr3 и так далее. Основная проблема в том, что это работает, если я просто запускаю его в обычном цикле for, поэтому я не могу понять, почему это не сработает.
$searchbase1 = 'OU=test 1,OU=USR,DC=contoso,DC=local'
$searchbase2 = 'OU=test 2,OU=USR,DC=contoso,DC=local'
$searchbase3 = 'OU=test 3,OU=USR,DC=contoso,DC=local'
$searchbase4 = 'OU=test 4,OU=USR,DC=contoso,DC=local'
$searchbase5 = 'OU=test 5,OU=USR,DC=contoso,DC=local'
$searchbase6 = 'OU=test 6,OU=USR,DC=contoso,DC=local'
$searchbaser = 'OU=test r,OU=USR,DC=contoso,DC=local'
$searchbases = 'OU=del,OU=USR,DC=contoso,DC=local'
$yr1 = Get-ADUser -Filter * -searchbase $searchbaser -Properties *
$yr2 = Get-ADUser -Filter * -searchbase $searchbase1 -Properties *
$yr3 = Get-ADUser -Filter * -searchbase $searchbase2 -Properties *
$yr4 = Get-ADUser -Filter * -searchbase $searchbase3 -Properties *
$yr5 = Get-ADUser -Filter * -searchbase $searchbase4 -Properties *
$yr6 = Get-ADUser -Filter * -searchbase $searchbase5 -Properties *
$yr7 = Get-ADUser -Filter * -searchbase $searchbase6 -Properties *
$yr8 = Get-ADUser -Filter * -searchbase $searchbases -Properties *
$elem=0
do
{
$elem =1
$yr='test' '$elem'
ForEach ($ADUser in $yr)
{
$homeDirectory = "\dc1database$($ADUser.sAMAccountname)"
$homeDrive = "H"
Set-ADUser -Identity $ADUser.sAMAccountname -Replace @{HomeDirectory=$homeDirectory}
Set-ADUser -Identity $ADUser.sAMAccountname -Replace @{HomeDrive=$homeDrive}
Set-ADUser -Identity $ADUser.sAMAccountname –scriptPath “Student.bat”
if ($homeDirectory){}else{mkdir $homeDirectory}
}
}
while($elem -le 8)
Комментарии:
1.
$yr
каждый раз присваивается тест номер элемента. Так зачем вам это нужноforeach
тогда? В любом случае, это повторится один раз. Но ваш do while будет повторяться до-le 8
2. Можете ли вы описать, что не работает? Выдает ли это исключение? Чего вы ожидаете от того, что происходит на самом деле.
3. это ошибка, которую я получаю: Set-ADUser: не удается проверить аргумент для параметра ‘Identity’. Аргумент равен null. Вся идея заключается в том, что все учащиеся в подразделениях получат свой домашний каталог, назначенный в AD, чтобы при входе пользователя на компьютер они могли сохранять его в общий файловый ресурс SMB. он также добавляет файл studet.bat пользователю AD, чтобы файл настройки student запускался при входе в систему.
Ответ №1:
Я переписал ваш скрипт так, как лично мне кажется более простым.
$searchAreas = @{
searchbase1 = 'OU=test 1,OU=USR,DC=contoso,DC=local'
searchbase2 = 'OU=test 2,OU=USR,DC=contoso,DC=local'
searchbase3 = 'OU=test 3,OU=USR,DC=contoso,DC=local'
searchbase4 = 'OU=test 4,OU=USR,DC=contoso,DC=local'
searchbase5 = 'OU=test 5,OU=USR,DC=contoso,DC=local'
searchbase6 = 'OU=test 6,OU=USR,DC=contoso,DC=local'
searchbaser = 'OU=test r,OU=USR,DC=contoso,DC=local'
searchbases = 'OU=del,OU=USR,DC=contoso,DC=local'
}
foreach($area in $searchAreas.Values){
$yr = Get-ADUser -Filter * -searchbase $area -Properties *
foreach($ADUser in $yr){
$homeDirectory = "\dc1database$($ADUser.sAMAccountname)"
$homeDrive = "H"
try{
Set-ADUser -Identity $ADUser.SamAccountName -Replace @{HomeDirectory=$homeDirectory}
}catch{
Write-Host "Failed to set user because $($_.Exception.Message)" -ForegroundColor Red
}
Set-ADUser -Identity $ADUser.SamAccountName -Replace @{HomeDrive=$homeDrive}
Set-ADUser -Identity $ADUser.SamAccountName –scriptPath “Student.bat”
if($homeDirectory){
}else{
mkdir $homeDirectory
}
}
}
Также проверьте методы try catch в Set-ADUser. Я настоятельно рекомендую всегда добавлять try catch ко всем вашим вызовам (поэтому вам придется добавлять их во все другие командлеты Set-ADUser, в mkdir и т.д.).
Надеюсь, это поможет
Комментарии:
1. Обратите внимание, что вместо хэш-таблицы для значений вы также могли бы создать массив ! 🙂
Ответ №2:
Пользователь powersell_ise. Если вы сохраните скрипт и добавите точку останова (F9) в Set-ADUser. Сценарий прервется. Теперь выберите $ADUser.sAMAccountName и нажмите (F8). Вы увидите значение параметра. Теперь вам будет легче понять, почему это не работает.
Должно быть, это как-то связано с тем фактом, что вы установили ‘test’ ‘$elem’. Кроме того, одинарные кавычки вокруг переменной сделают ее строкой, а не переменной. Итак, проверьте этот вывод:
$yr='test' '$elem'
$yr
Результат:
протестируйте $elem
Надеюсь, это поможет
Комментарии:
1. Спасибо, теперь я понимаю, что вы имеете в виду. похоже, мне нужно будет сохранить это только в циклах for, как я пытался, без кавычек: выражение присваивания недопустимо. Входными данными для оператора присваивания должен быть объект, способный принимать назначения, такой как переменная или свойство