цикл foreach не работает в цикле do while - PullRequest
0 голосов
/ 27 марта 2019

У меня есть небольшой кусочек кода, который мне приходилось выполнять на уровне года, и я хотел, чтобы он выполнялся в цикле do while, чтобы кода было не так много. Идея в том, что код будет сохранять переменную со строкой и int то есть .. год1 год2 год3 и так далее. Основная проблема заключается в том, что он работает, если я просто запускаю его в обычном цикле 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 = "\\dc1\database\$($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)

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я переписал ваш сценарий так, чтобы лично мне было проще.

$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 = "\\dc1\database\$($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 и т. Д.

Надеюсь, это поможет

0 голосов
/ 27 марта 2019

Пользователь Powershell_ISE. Если вы сохраните скрипт и добавите точку останова (F9) в Set-ADUser. Сценарий сломается. Теперь выберите $ ADUser.sAMAccountname и нажмите (F8). Вы увидите значение параметра. Теперь вам будет легче понять, почему это не работает.

Это должно быть как-то связано с тем, что вы установили 'test' + '$ elem'. Кроме того, одинарные кавычки вокруг переменной сделают ее строкой вместо переменной. Поэтому проверьте этот вывод:

$yr='test'+'$elem'
$yr

Результат:

тест $ эль

Надеюсь, это поможет

...