foreach循环在do while循环中不起作用

时间:2019-03-27 07:46:01

标签: powershell powershell-v3.0 powershell-v4.0

我有一些每年必须运行的代码,我想让它在do while循环中运行,以便没有太多的代码。这个想法是代码将用字符串和int保存一个var 即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 = "\\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 :(得分:0)

用户Powershell_ISE。如果保存脚本并在Set-ADUser处添加断点(F9)。脚本将中断。现在选择$ ADUser.sAMAccountname并按(F8)。您将看到参数的值。现在,您将更容易理解为什么它不起作用。

它必须与您设置'test'+'$ elem'有关。另外,变量周围的单引号将使它成为字符串而不是变量。因此,请检查以下输出:

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

结果是:

  

test $ elem

希望这会有所帮助

答案 1 :(得分:0)

我已将您的脚本重写为我觉得更容易的一种方式。

$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
        }
    }
}

还要检查Set-ADUser周围的try catch方法。我强烈建议始终在所有呼叫中添加try catch(因此,您必须将它们添加到所有其他Set-ADUser cmdlet和mkdir等中。

希望这会有所帮助