У меня есть сценарий, в котором мне нужно подождать в цикле ForEach
перед выполнением команды.
$classList = Get-ClassList
forEach ($class in $classList) {
$studentList = Get-StudentList -class $class.Name
forEach ($student in $studentList) {
Write-Host $student.Name
$rollCall = Roll-Call -student $student.Name
}
}
Вещь, которую я хочу решить, - подождать, пока ученик перекатится.Когда он уже объявлен по перекличке, мне нужно получить его вывод (просто информацию по перекличке) следующим образом:
$update = Get-RollCallOutput-student $student.Name -class $class.Name
перекличка каждого студента может варьироваться.Кроме того, выход имеет тип String.Object[]
.Тем не менее, чтобы получить конкретный вывод, мне нужно зациклить Обновление Roll-Call.
forEach ($output in $update) {
Get-Output -outputID $output.Id -student $student.Name
}
По замыслу, если перекличка студента завершена, Get-RollCallOutput
не вернет Нулевой .В противном случае это ноль.Тем не менее, чтобы дождаться, пока вывод NOT будет NULL, я использовал While($job)
$update = Get-RollCallOutput-student $student.Name -class $class.Name
while($job)
forEach ($output in $update) {
Get-Output -outputID $output.Id -student $student.Name
}
Проблема заключается в том, что он находится внутри вложенного ForEach, который всегда висит.В настоящее время обходной путь должен использовать Start-Sleep -s 15
, чтобы дождаться выполнения переклички, прежде чем скрипт перейдет к запросу на вывод.Я знаю, что это не очень хорошее решение и действительно влияет на производительность.Тем не менее, при поиске лучшего способа это было бы приемлемо.
[ Обновлено ] Даже использовать Do ... While
, но не работает.Я всегда вижу, как он завис после команды Roll-Call.
Do {
$update = Get-RollCallOutput-student $student.Name -class $class.Name
}
While ($job) {...}