我有一些每年必须运行的代码,我想让它在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)
答案 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等中。
希望这会有所帮助