foreach 循环在 do while 循环中不起作用
foreach loop not working in a do while loop
我有一小部分代码必须每年 运行,我想在 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)
用户Powershell_ISE。如果您保存脚本并在 Set-ADUser 处添加一个断点 (F9)。脚本会中断。现在 select $ADUser.sAMAccountname 并按 (F8)。您将看到参数的值。现在您将更容易理解为什么它不起作用。
一定和你设置了'test' + '$elem'有关。此外,变量周围的单引号将使它成为一个字符串而不是变量。所以检查这个输出:
$yr='test'+'$elem'
$yr
结果是:
test$elem
希望对您有所帮助
我已经将您的脚本重写为我个人认为更容易的方式。
$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 等中。
希望对您有所帮助
我有一小部分代码必须每年 运行,我想在 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)
用户Powershell_ISE。如果您保存脚本并在 Set-ADUser 处添加一个断点 (F9)。脚本会中断。现在 select $ADUser.sAMAccountname 并按 (F8)。您将看到参数的值。现在您将更容易理解为什么它不起作用。
一定和你设置了'test' + '$elem'有关。此外,变量周围的单引号将使它成为一个字符串而不是变量。所以检查这个输出:
$yr='test'+'$elem'
$yr
结果是:
test$elem
希望对您有所帮助
我已经将您的脚本重写为我个人认为更容易的方式。
$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 等中。
希望对您有所帮助